iOS UITableView 与 UITableViewController实例详解

2020-01-18 15:58:57丽君


#import "JXItemStore.h"
#import "JXItem.h"
@interface JXItemStore ()
/** 可变数组,用来操作 JXItem 对象 */
@property (nonatomic,strong) NSMutableArray * privateItems;
@end
@implementation JXItemStore
// 单粒对象
+ (instancetype)sharedStore {
static JXItemStore * sharedStore = nil;
// 判断是否需要创建一个 sharedStore 对象
if (!sharedStore) {
sharedStore = [[self alloc] init];
}
return sharedStore;
}
- (NSArray *)allItem {
return self.privateItems;
}
#pragma mark - 懒加载
- (NSMutableArray *)privateItems{
if (_privateItems == nil) {
_privateItems = [[NSMutableArray alloc] init];
}
return _privateItems;
}
@end

  allItem 方法的返回值是 NSArray 类型,但是方法体中返回的是 NSMutableArray 类型的对象,这种写法是正确的,因为NSMutableArray 是 NSArray 子类。

  这种写法可能会引起一个问题:虽然头文件中将 allItem 的类型声明为 NSArray ,但是其他对象调用 JXItemStore 的 allItem 方法时,得到的一定是一个 NSMutableArray 对象。

  使用像 JXItemStore 这样的类时,应该遵守其头文件中的声明使用类的属性和方法。 例如,在 JXItemStore 头文件中,因为 allItem 属性的类型是 NSArray ,所以应该将其作为 NASrray 类型的对象使用。如果将 allItem 转换为 NSMutableArray 类型并修改其内容,就违反了 JXItemStore 头文件中的声明。可以通过覆盖 allItem 方法避免其他类修改 allItem 。


#import "JXItemStore.h"
#import "JXItem.h"
@interface JXItemStore ()
/** 可变数组,用来操作 JXItem 对象 */
@property (nonatomic,strong) NSMutableArray * privateItems;
@end
@implementation JXItemStore
// 单粒对象
+ (instancetype)sharedStore {
static JXItemStore * sharedStore = nil;
// 判断是否需要创建一个 sharedStore 对象
if (!sharedStore) {
sharedStore = [[self alloc] init];
}
return sharedStore;
}
- (NSArray *)allItem {
return [self.privateItems copy];
}
- (JXItem *)createItem {
JXItem * item = [JXItem randomItem];
[self.privateItems addObject:item];
return item;
}
#pragma mark - 懒加载
- (NSMutableArray *)privateItems{
if (_privateItems == nil) {
_privateItems = [[NSMutableArray alloc] init];
}
return _privateItems;
}
@end

  实现数据源方法  


#import "JXItemsViewController.h"
#import "JXItem.h"
#import "JXItemStore.h"
@interface JXItemsViewController ()
@end
@implementation JXItemsViewController
- (instancetype)init {
// 调用父类的指定初始化方法
self = [super initWithStyle:UITableViewStylePlain];
if (self) {
for (NSInteger i=0; i<5; i++) {
[[JXItemStore sharedStore] createItem];
}
}
return self;
}
- (instancetype)initWithStyle:(UITableViewStyle)style {
return [self init];
}
@end

  当某个 UITableView 对象要显示表格内容时,会向自己的数据源(dataSource 属性所指向的对象)发送一系列消息,其中包括必须方法和可选方法。