UITableView数据源方法
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView//有多少组数据
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section//第section组有多少行
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath//每一行显示怎么样的内容(cell)
- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section//第section组显示怎样的头部标题(直接返回字符串即可)注意:当tableview的style是plain的时候有悬浮效果,group的话是没有悬浮效果的哦。
- (NSString *)tableView:(UITableView *)tableView titleForFooterInSection:(NSInteger)section//第section组显示怎样的尾部标题(和头部一样的)
如果你要设置每行固定的高度可以设置tableview的rowHeight或者调用- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath不过这个方法可以设置每行或者每组的高度
如果要设置cell的背景色最好使用backgroundView(背景view不用设置尺寸, backgroundView的优先级 > backgroundColor)还有一个选中的背景(同理)
设置cell右边指示器的类型 cell.accessoryType 这是一个枚举,可以进行选择,具体自己尝试
cell.accessoryView可以设置指示器为自定义view
tableView.separatorStyle设置tableview的分割线样式
tableView.separatorColor可以设置分割线的颜色
tableView.tableHeaderView可以设置tableView的头部view
tableView.tableFooterView可以设置tableView的头部view
默认分割线是不到头的,如果让他显示整个屏幕的宽带可以使用这行代码进行操作
设置TableView分割线从边框顶端开始
-(void)viewDidLayoutSubviews {
if ([self.tableView respondsToSelector:@selector(setSeparatorInset:)]) {
[self.tableView setSeparatorInset:UIEdgeInsetsZero];
}
if ([self.tableView respondsToSelector:@selector(setLayoutMargins:)]) {
[self.tableView setLayoutMargins:UIEdgeInsetsZero];
}
}
- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
if ([cell respondsToSelector:@selector(setSeparatorInset:)]) {
[cell setSeparatorInset:UIEdgeInsetsZero];
}
if ([cell respondsToSelector:@selector(setLayoutMargins:)]) {
[cell setLayoutMargins:UIEdgeInsetsZero];
}
}
这个方法会在有一个cell进入视野范围的时候就调用
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath这个方法如果不使用缓存池创建cell的话是非常好性能的,比如你程序中有20个cell,那么他就会创建20次,内存占用会比较大,一般创建cell建议使用缓存池创建,当用户滑动tableview的时候超过屏幕显示范围的cell会放到缓存池里面去,需要显示的时候再去缓存池里面去取,比如你的手机屏幕只可以显示8个cell,那么程序只会创建8次cell,不会再去创建20次了,这样会大大的提高性能。
缓存池的创建方法如下
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
// static修饰局部变量:可以保证局部变量只分配一次存储空间(只初始化一次)
static NSString *ID = @"hero";
// 1.通过一个标识去缓存池中寻找可循环利用的cell
// dequeue : 出列 (查找)
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:ID];
// 2.如果没有可循环利用的cell
if (cell == nil){
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:ID];
// NSLog(@"------缓存池找不到cell--%d", indexPath.row);
}
return cell;
}
首先你需要创建一个标示符,让偶绑定标示符,通过标示符去缓存池里面去取,如果缓存池没有这个标示符的cell那么就需要你先创建cell,以后就会从缓存池里面去取cell了。注意:标示符最好使用static进行修饰,这样可以保证局部变量只分配一次存储空间,不会重复申请内存空间进行注册,也是为了性能着想。
- (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView左侧的索引条(一般见于选择城市的时候)返回右边索引条显示的字符串数据
[self.tableView reloadData]这个可以对整个tableview进行数据刷新,如果只是对某一行进行 刷新的话建议使用
NSIndexPath *path = [NSIndexPath indexPathForRow:index.row inSection:0];
[self.tableView reloadRowsAtIndexPaths:@[path] withRowAnimation:UITableViewRowAnimationLeft];这个方法 ,@[path]这个是数组,而且还可以伴随动画,这样可以提高性能。
reloadData : tableView会向数据源重新请求数据
重新调用数据源的相应方法取得数据
重新调用数据源的tableView:numberOfRowsInSection:获得行数
重新调用数据源的tableView:cellForRowAtIndexPath:得知每一行显示怎样的cell
cell的样式有如下四种,如果不满足需求,请进行自定义cell
1、UITableViewCellStyleDefault
该格式提供了一个简单的左对齐的文本标签textLabel和一个可选的图像imageView。如果显示图像,那么图像将在最左边。
这种格式虽然可以设置detailTextLabel,但是不会显示该标签。
2、UITableViewCellStyleSubtitle
该格式与前一种相比,增加了对detailTextLabel的支持,该标签将会显示在textLabel标签的下面,字体相对较小。
3、UITableViewCellStyleValue1
该格式居左显示textLabel,居右显示detailTextLabel,且字体较小。
4、UITableViewCellStyleValue2
该格式居左现实一个小型蓝色主标签textLabel,在其右边显示一个小型黑色副标题详细标签detailTextLabel。
该格式不支持图像