UITableView随笔笔记

王朝学院·作者佚名  2016-08-27
窄屏简体版  字體: 小  |  中  |  大  |  超大  

UITableView 继承自UIScrollView,所以可以滚动,但只能是纵方向上的。

UITableView由section和cell组成,填充的内容来自数据源,一般数据源由ViewController作为代理,因此需要遵循它的两个协议,分别是UITableViewDataSource 和 UITableViewDelegate。

UITableView的简单实现步骤:

1. 设置UITableView在视图中,可以表现为Plain和Grouped两种风格;

2. 将UITableView的dataSource设置为ViewController,并让ViewController遵循UITableViewDataSource协议;

3. 利用DataSource协议设置UITableView的sections有多少个,调用方法numberOfSectionsInTableView,返回sections的个数;

4. 设置UITableView的每个section中有多少行,调用方法numberOfRowsInSection,返回sections的行数;

5. 设置UITableView中sections的首部标题,调用方法titleForHeaderInSection,尾部标题方法为titleForFooterInSection;

6.1 设置cell中显示的内容,调用方法cellForRowAtIndexPath。通过传入的(NSIndexPath*)indexPath来确定具体的row来给定内容,最终返回UITableViewCell类型的cell对象;

6.2 其中NSIndexPath包含了section和row,可以准确定位是哪个section中的哪个row;

6.3 取得的数据内容将传递给UITableViewCell中的textLable的text属性

UITableViewCellStyle有四种模式,当设置为UITableViewCellStyleSubtitle的时候可以增加副标题文字说明效果;

依然在cellForRowAtIndexPath中设置UITableView的相关属性:

6.4 在UITableViewCell中有imageView属性,可以设置每个cell的图标,将图片名传给image属性;

6.5 副标题设置是detailTextLabel,是个UILabel,可设置内容颜色等;

6.6accessoryType可设置accessory类型,是选项或是箭头指示;

如果修改了数据模型,需要让viewcontroller通知view刷新一下,刷新方法分为全部和局部;

1.reloadData 将刷新全部数据

2.reloadRowsAtIndexPaths 刷新局部数据

- (void)reloadRowsAtIndexPaths:(NSArray *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation

indexPaths是NSIndexPath类型的数组,animation为枚举类型的UITableViewRowAnimation,设置刷新的动画效果;

UITableView的数据优化

之前6.1中设置cell中显示的内容,调用方法cellForRowAtIndexPath内,在对UITableViewCell实例化的时候,用到的:

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier

其中reuseIdentifier就是设置重用标示符,将不显示的数据会丢入缓存池中,然后即将显示的cell会在缓存池中通过标示符来查找,如果找到该标示符的cell就直接拿过来重用,避免重新实例化消耗内存影响性格,达到优化目的;如果没找到对应标示符的cell就实例化一个。具体代码如下:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{

static NSString*reuseIdentifierStr =@"myCell";//在缓冲池中寻找UITableViewCell *cell =[tableView dequeueReusableCellWithIdentifier:reuseIdentifierStr];//如果没找到,就实例化一个新的cellif(!cell) {

cell=[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:reuseIdentifierStr];

}PRoduct*p =data[indexPath.row];

cell.textLabel.text=p.name;

cell.imageView.image=[UIImage imageNamed:p.icon];

cell.detailTextLabel.text=p.detail;

cell.detailTextLabel.textColor=[UIColor grayColor];

cell.accessoryType=UITableViewCellAccessoryDisclosureIndicator;returncell;

}

7. UITableView中cell的添加删除操作,使用到Toolbar的添加删除按钮

7.1 在添加删除按钮中设置UITableViewCellEditingStyle的标识,1为删除,2为添加。因为该枚举类型是只读的,所以只能通过对tableview的tag进行设置,来识别是添加操作还是删除操作。

- (IBAction)action:(UIBarButtonItem *)sender {if(sender.tag ==1) {

_tableView.tag=UITableViewCellEditingStyleDelete;

}else{

_tableView.tag=UITableViewCellEditingStyleInsert;

}

BOOL isEdit=_tableView.isEditing;

[_tableView setEditing:!isEdit];

}

7.2 标识需要在方法editingStyleForRowAtIndexPath中的返回值设置,这样就知道了是删除操作还是添加操作。

- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath{return_tableView.tag;

}

7.3 相应的操作需要在commitEditingStyle中实现

- (void) tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath{//删除操作if(editingStyle ==1) {//删除数据[_dataList removeObjectAtIndex:indexPath.row];//更新cell[tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationRight];

}else{//添加数据[_dataList insertObject:@"新建数据"atIndex:indexPath.row +1];//更新cellNSIndexPath *insertIndexPath = [NSIndexPath indexPathForRow:indexPath.row +1inSection:indexPath.section];

[tableView insertRowsAtIndexPaths:@[insertIndexPath] withRowAnimation:UITableViewRowAnimationTop];

}

}

 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
© 2005- 王朝網路 版權所有 導航