UITableView简单封装
UITableView时iOS开发中使用最多也是最重的一个UI空间,其实在App Store里面的%80以上的应用都用到了这个控件,所以就给大家介绍一下,前面的文章中也提到了,在后面的文章中将会详细解释。
当然这篇文档并不是介绍证明去使用它,只是说说怎么去封装活着更好的使用。
这里主要是关于UItableView中Cell中的多功能实现
一:新建一个模型数据,用于Cell的实现
/** * 覆盖系统的枚举 */ typedef enum { CellItemTypeNone, // don't show any accessory view CellItemTypeDisclosureIndicator, // regular chevron. doesn't track CellItemTypeDetailDisclosureButton, // info button w/ chevron. tracks CellItemTypeCheckmark, // checkmark. doesn't track CellItemTypeDetailButton NS_ENUM_AVAILABLE_IOS(7_0), // info button. tracks CellItemTypeSwitch//扩充 /** * 当以后我们使用tableView的时候,如果每个Cell或者Cell的右边有系统Cell存在的控件或者View的时候,我们只要先在这里定义对应的控件或者View */ }CellItemType; @interface iCocosModel : NSObject //文字标题 @property (nonatomic, copy) NSString *title; //子标题 @property (nonatomic, copy) NSString *subtitle; //类名,点击对应的行显示对应类的控制器 @property (nonatomic, copy) NSString *className; //类型:比如事剪头还是按钮还是Switch活着其他的 @property (nonatomic, assign) CellItemType cellItemType; /** * 初始化方法 */ +(id)itemWithTitle:(NSString *)title cellItemType:(CellItemType)cellItemType;
模型数据方法的实现
/** * 初始化方法 */ +(id)itemWithTitle:(NSString *)title cellItemType:(CellItemType)cellItemType { iCocosModel *item = [[iCocosModel alloc] init]; /** * 转为对应的模型 */ item.title = title; item.cellItemType = cellItemType; //返回每一个项 return item; }
完成了这一步,我们使用起来就非常简单了。
#import "iCocosViewController.h" /** * 对应的模型类 */ #import "iCocosModel.h" @interface iCocosViewController () { NSArray *_cellItems; } @end @implementation iCocosViewController //重写这个方法实现分组:改变默认是形式 -(id)init { return [self initWithStyle:UITableViewStyleGrouped]; } - (void)viewDidLoad { [super viewDidLoad]; [self addCellItems]; }
这里时最重要的部分:
-(void)addCellItems { /** * 这里就是使用的实现方法,我要添加什么行就先创建行,然后放到_cellitems数组中 */ iCocosModel *note = [iCocosModel itemWithTitle:@"通知设置" cellItemType:CellItemTypeDisclosureIndicator]; iCocosModel *update = [iCocosModel itemWithTitle:@"上传高清图片" cellItemType:CellItemTypeSwitch]; iCocosModel *photo = [iCocosModel itemWithTitle:@"照片水印" cellItemType:CellItemTypeSwitch]; _cellItems = @[ @[note], @[update, photo] ]; }
代理方法的实现
#pragma mark TableView代理方法 //节数 -(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { //数组的个数,里面可能还有字典 return _cellItems.count; } //行数 - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { //数组中每个元素(字典)包含子元素的个数 NSArray *array = _cellItems[section]; return array.count; } //对应的数据 #pragma mark 每当有一个cell进入视野范围内就会调用,返回当前这行显示的cell - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *ID = @"Cell"; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:ID]; if (cell == nil) { cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:ID]; } /** * 从模型中取得子元素 */ iCocosModel *item = _cellItems[indexPath.section][indexPath.row]; cell.textLabel.text = item.title; if (item.cellItemType == CellItemTypeSwitch) { cell.accessoryView = [[UISwitch alloc] init]; } else { cell.accessoryType = item.cellItemType; } return cell; } -(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { }
如果你到了这一步说明你已经成功了,当然步骤是死的,人是活的,你也可以实现更加复杂活着实用的功能,在后面的文章我将会对他进行更加深入的封装,最后不管到了那里都可拿来用,这才是一个真正的开发者,不是吗!