UITableView
2016-01-30 本文已影响190人
Z了个L
- UITableView性能优化
/**
* 每当一个cell进入视野范围内就会调用1次
*/
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
// 0.定义一个重用标识
static NSString *ID = @"wine";
// 1.去缓存池取可循环利用的cell
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:ID];
// 2.如果缓存池没有可循环利用的cell,自己创建
if (cell == nil) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:ID];
}
// 3.设置数据
cell.textLabel.text = [NSString stringWithFormat:@"第%zd行数据",indexPath.row];
return cell;
}
UITableViewController的注意点
- self.view和self.tableView是同一个对象
UITableView的两种样式
- UITableViewStylePlain
- UITableViewStyleGrouped
UITableView的属性
// 设置每一行cell的高度
self.tableView.rowHeight = 80;
// 设置每一组的头部标题高度
self.tableView.sectionHeaderHeight = 50;
// 设置每一组的尾部标题高度
self.tableView.sectionFooterHeight = 50;
// 设置分割线的颜色
self.tableView.separatorColor = [UIColor redColor];
// 设置分割线的样式
self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone;
// 设置表头控件---这里主要应用是打广告
self.tableView.tableHeaderView = [[UISwitch alloc] init];
// 设置表尾控件---这里主要应用是加载数据
self.tableView.tableFooterView = [[UISwitch alloc] init];
// 设置索引条的文字颜色
self.tableView.sectionIndexColor = [UIColor orangeColor];
// 设置索引条的背景颜色
self.tableView.sectionIndexBackgroundColor = [UIColor yellowColor];
- 要隐藏UITableView的分割线的两种方法
// 方法一:设置分割线的颜色
self.tableView.separatorColor = [UIColor clearColor];
// 方法二:设置分割线的样式
self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone;
UITableViewDelegate方法
/**
* 当用户点击(选中)某一行cell就会调用这个方法
*/
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
NSLog(@"选中了:%zd",indexPath.row);
}
/**
* 当用户取消点击(选中)某一行cell就会调用这个方法
*/
- (void)tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath
{
NSLog(@"取消选中了:%zd",indexPath.row);
}
/**
* 返回每一组的头部高度
*/
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
{
}
/**
* 返回每一组的尾部高度
*/
- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section
{
}
/**
* 返回每一行cell的高度
*/
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
if (indexPath.row % 2 == 0) {
return 50;
} else {
return 100;
}
}
/**
* 返回每一组的头部控件
*/
- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
{
return [UIButton buttonWithType:UIButtonTypeContactAdd];
}
/**
* 返回每一组的尾部控件
*/
- (UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section
{
return [UIButton buttonWithType:UIButtonTypeContactAdd];
}
- 返回每一组的头部控件和尾部控件的优先级要高于返回每一组的头部标题和尾部标题,所以,如果同时设置的话,那么就会只有前者会起作用
UITableViewDataSource方法
section 第几组,0,1,2,...
indexPath 确定每组中的每一行,比如第0组第0行,第1组第0行,...indexPath.section---第几组,indexPath.row---第几行
/********************************************************
1> plist解析:
以后遇到像这种复杂的plist,一层一层的往下解析.
最终的目的就是将所有的字典转成模型.
如果plist中字典在一个数组中,将来转出来的模型也放在一个数组中.
也就是将字典数组转成模型数组.
2> plist的好处:方便管理数据
*******************************************************/
/**
* 告诉tableView一共有多少组数据
*/
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
/**
* 告诉tableView第section组有多少行
*/
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
/**
* 告诉tableView每一行显示的内容(tableView每一行的内容是是第一个UITableViewCell)
*/
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
/**
* 告诉tableView每一组的头部标题
*/
- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section
/**
* 告诉tableView每一组的尾部标题
*/
- (NSString *)tableView:(UITableView *)tableView titleForFooterInSection:(NSInteger)section
/**
* 返回索引条的文字
*/
- (NSArray<NSString *> *)sectionIndexTitlesForTableView:(UITableView *)tableView
{
// NSMutableArray *titles = [NSMutableArray array];
// for (XMGCarGroup *group in self.carGoups) {
// [titles addObject:group.title];
// }
// return titles;
// 抽取self.carGoups这个数组中每一个元素(XMGCarGroup对象)的title属性的值,放在一个新的数组中返回
return [self.carGoups valueForKeyPath:@"title"];
}
UITableViewCell属性
// 设置右边显示的指示控件
// accessoryView的优先级 > accessoryType
// cell.accessoryView = [[UISwitch alloc] init];
// 设置右边显示的指示样式
cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
// 设置cell选中的样式
// 设置cell的选中样式无
// cell.selectionStyle = UITableViewCellSelectionStyleNone;
// 下面三种方式在iOS7之后,表现形式一样了,都是灰色
// cell.selectionStyle = UITableViewCellSelectionStyleBlue;
// cell.selectionStyle = UITableViewCellSelectionStyleDefault;
// cell.selectionStyle = UITableViewCellSelectionStyleGray;
// 设置cell的背景控件
// backgroundView的优先级 > backgroundColor
// UIView *bg = [[UIView alloc] init];
// bg.backgroundColor = [UIColor blueColor];
// cell.backgroundView = bg;
// 设置cell的背景颜色
// cell.backgroundColor = [UIColor redColor];
// 设置cell选中的背景view
UIView *seletedBg = [[UIView alloc] init];
seletedBg.backgroundColor = [UIColor yellowColor];
cell.selectedBackgroundView = seletedBg;
- 设置cell的背景颜色
// 下面代码可以调换顺序,效果一样
cell.backgroundColor = [UIColor redColor];
UIView *bg = [[UIView alloc] init];
bg.backgroundColor = [UIColor blueColor];
cell.backgroundView = bg;
效果图片:
- 设置cell选中的背景view
// 设置cell选中的背景view
UIView *seletedBg = [[UIView alloc] init];
seletedBg.backgroundColor = [UIColor yellowColor];
cell.selectedBackgroundView = seletedBg;
效果图片
- 性能优化(注册)
- 注册实际上是,先到缓冲池里面找有没有可用的UITableViewCell,如果有,那就用,如果没有,因为注册了,系统会给你按照你指定的类型来创建cell类型对象
#import "ViewController.h"
#import "XMGTestCell.h"
@interface ViewController ()
@end
@implementation ViewController
NSString *ID = @"wine";
- (void)viewDidLoad {
[super viewDidLoad];
self.tableView.rowHeight = 100;
// 注册 ID这个标识 对应的 cell类型 为UITableViewCell这种类型
[self.tableView registerClass:[XMGTestCell class] forCellReuseIdentifier:ID];
}
#pragma mark - 数据源方法
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return 200;
}
/**
* 每当一个cell进入视野范围内就会调用1次
*/
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
// 1.去缓存池取可循环利用的cell
XMGTestCell *cell = [tableView dequeueReusableCellWithIdentifier:ID];
// 2.设置数据
cell.textLabel.text = [NSString stringWithFormat:@"第%zd行数据",indexPath.row];
return cell;
}
@end
- 设置索引条的文字颜色和背景颜色
// 设置索引条的文字颜色
self.tableView.sectionIndexColor = [UIColor orangeColor];
// 设置索引条的背景颜色
self.tableView.sectionIndexBackgroundColor = [UIColor yellowColor];
// tableView Scroll to bottom
- (void)tableViewScrollToBottom {
if (self.chatModel.dataSource.count==0)
return;
NSIndexPath *indexPath = [NSIndexPath indexPathForRow:self.chatModel.dataSource.count-1 inSection:0];
[self.chatTableView scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionBottom animated:YES];
}