UITableView, 表视图
UITableView, 表视图
样式
1.UITableViewStylePlain, 正常样式
2.UITableViewStyleGrouped, 分组样式
行高, 默认44
tableView.rowHeight = 80;
分隔线的颜色
tableView.separatorColor = [UIColor orangeColor];
tableView.separatorStyle = UITableViewCellSeparatorStyleSingleLine;
分隔线间距(上 左 下 右)
tableView.separatorInset = UIEdgeInsetsMake(0, 0, 0, 0);
表头(重在显示内容)
UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 375, 40)];
label.text = @"表 头";
label.backgroundColor = [UIColor colorWithRed:1.000 green:0.999 blue:0.599 alpha:1.000];
tableView.tableHeaderView = label;
label.textAlignment = NSTextAlignmentCenter;
[label release];
表尾(重在去除虚拟行数)
// UIView *footerView = [[[UIView alloc] initWithFrame:CGRectZero] autorelease];
// footerView.backgroundColor = [UIColor colorWithRed:0.741 green:1.000 blue:0.836 alpha:1.000];
// [footerView release];
// UIView *footerView = [[UIView new] autorelease];
tableView.tableFooterView = [[UIView new] autorelease];
附加视图样式
UITableViewCellAccessoryNone, 无
UITableViewCellAccessoryDisclosureIndicator, >
UITableViewCellAccessoryDetailDisclosureButton, ! + >
UITableViewCellAccessoryCheckmark, √
UITableViewCellAccessoryDetailButton, !
数值数据源, 由谁为tableView提供数据
tableView.dataSource = self;
- (void)createData {
1.数组 + 字典
// NSDictionary *person1 = @{@"name": @"陈强", @"Phone": @"15776995908"};
// NSDictionary *person2 = @{@"name": @"蹦蹦", @"Phone": @"18336394321"};
// NSDictionary *person3 = @{@"name": @"炳焱", @"Phone": @"15238841866"};
//
// self.personArray = [NSMutableArray arrayWithObjects:person1, person2, person3, nil];
2.数组 + 数据模型
// Person *p1 = [Person personWithName:@"小强" teleNumber:@"15776995908"];
// Person *p2 = [Person personWithName:@"阿呆" teleNumber:@"14646546486"];
// Person *p3 = [Person personWithName:@"阿狸" teleNumber:@"74641356413"];
//
// self.personArray = [NSMutableArray arrayWithObjects:p1, p2, p3, nil];
3.分区数据
//分区1
Person *p1 = [Person personWithName:@"阿强" teleNumber:@"15776995908"];
Person *p2 = [Person personWithName:@"阿呆" teleNumber:@"14646546486"];
Person *p3 = [Person personWithName:@"阿狸" teleNumber:@"74641356413"];
NSMutableArray *array1 = [NSMutableArray arrayWithObjects:p1, p2, p3, nil];
//分区2
Person *p4 = [Person personWithName:@"包强" teleNumber:@"15776995908"];
Person *p5 = [Person personWithName:@"保呆" teleNumber:@"14646546486"];
Person *p6 = [Person personWithName:@"宝狸" teleNumber:@"74641356413"];
Person *p7 = [Person personWithName:@"豹虎" teleNumber:@"54666566583"];
NSArray *array2 = @[p4, p5, p6, p7];
//分区3
Person *p8 = [Person personWithName:@"超强" teleNumber:@"15776995908"];
Person *p9 = [Person personWithName:@"超呆" teleNumber:@"14646546486"];
Person *p10 = [Person personWithName:@"曹狸" teleNumber:@"74641356413"];
Person *p11 = [Person personWithName:@"曹虎" teleNumber:@"54666566583"];
Person *p12 = [Person personWithName:@"超期" teleNumber:@"54666566583"];
NSArray *array3 = @[p8, p9, p10, p11, p12];
self.personArray = [NSMutableArray arrayWithObjects:array1, array2, array3, nil];
self.navigationItem.title = @"表视图";
self.navigationItem.rightBarButtonItem = [[[UIBarButtonItem alloc] initWithBarButtonSystemItem:(UIBarButtonSystemItemRefresh) target:self action:@selector(refresh)] autorelease];
}
- (void)refresh {
NSMutableArray *array = self.personArray[0];
if ([self.personArray[0] count] > 0) {
[array removeObjectAtIndex:0];
//tableView的数据源发生变化, tableView不会跟着变化, 需要刷新一下tableView
UITableView *tableView = (UITableView *)[self.view viewWithTag:1028];
//重新加载数据
[tableView reloadData];
}
}
Person.m #import "Person.h" @implementation Person - (void)dealloc { [_name release]; [_teleNumber release]; [super dealloc]; } - (instancetype)initWithName:(NSString *)name teleNumber:(NSString *)teleNumber { self = [super init]; if (self) { self.name = name; self.teleNumber = teleNumber; } return self; } + (instancetype)personWithName:(NSString *)name teleNumber:(NSString *)teleNumber { return [[Person alloc] initWithName:name teleNumber:teleNumber]; } - (NSString *)description { return [NSString stringWithFormat:@"name:%@ teleNumber:%@", _name, _teleNumber]; } @end
#pragma mark - UITableViewDataSource
分区个数, 默认为1
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
return self.personArray.count;
}
分区行数
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return [[self.personArray objectAtIndex:section] count];
}
cell的创建
当要显示一个cell的时候, 就会执行此方法
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
// NSLog(@"%s", __FUNCTION__);
NSIndexPath, 继承于NSObject, 用于存储cell的位置(分区和行数)
// NSLog(@"%ld, %ld", indexPath.section, indexPath.row);
UITableViewCell, 单元格, 继承于UIView, 用于展示数据
样式
1.Default: 左imageView, 右textLabel
2.value1: 左imageView, 中textLabel, 右detailTextLabel
3.value2: 左textLabel, 右detailTextLabel
4.subtitle: 左imageView, 右上textLabel, 右下detailTextLabel
UITableViewCell *cell = [[UITableViewCell alloc] initWithStyle:(UITableViewCellStyleSubtitle) reuseIdentifier:@"辉哥好帅"];
cell.textLabel.text = [NSString stringWithFormat:@"%ld, %ld", indexPath.section, indexPath.row];
cell.imageView.image = [UIImage imageNamed:@"li.jpg"];
cell.detailTextLabel.text = @"我喜欢桃子";
cell.contentView.backgroundColor = [UIColor colorWithRed:0.665 green:1.000 blue:0.962 alpha:1.000];
accessoryView, 附加视图
// cell.accessoryView =
附加视图样式
UITableViewCellAccessoryNone, 无
UITableViewCellAccessoryDisclosureIndicator, >
UITableViewCellAccessoryDetailDisclosureButton, ! + >
UITableViewCellAccessoryCheckmark, √
UITableViewCellAccessoryDetailButton, !
cell.accessoryType = UITableViewCellAccessoryDetailButton;
return [cell autorelease];
重用机制创建cell
指定重用标识符
static NSString *string = @"慧慧";
根据重用标识符, 去重用池中找cell
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:string];
判断是否找到cell
if (cell == nil) {
没有cell, 创建cell
cell = [[[UITableViewCell alloc] initWithStyle:(UITableViewCellStyleSubtitle) reuseIdentifier:string] autorelease];
NSLog(@"+++");
}
cell赋值
// cell.imageView.image = [UIImage imageNamed:@"li.jpg"];
// cell.textLabel.text = @"你是我心中的玫瑰花";
1
NSDictionary *dic = [self.personArray objectAtIndex:indexPath.row];;
cell.textLabel.text = [dic objectForKey:@"name"];
cell.detailTextLabel.text = [dic objectForKey:@"Phone"];
2
Person *person = [self.personArray objectAtIndex:indexPath.row];
cell.textLabel.text = person.name;
cell.textLabel.text = [[self.personArray objectAtIndex:indexPath.row] name];
cell.detailTextLabel.text = person.teleNumber;
NSArray *array = self.personArray[indexPath.section];
Person *person = array[indexPath.row];
cell.textLabel.text = person.name;
cell.detailTextLabel.text = person.teleNumber;
//返回cell
return cell;
}
区头标题
- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {
NSArray *titleArray = @[@" A", @" B", @" C"];
return titleArray[section];
}
区尾标题
- (NSString *)tableView:(UITableView *)tableView titleForFooterInSection:(NSInteger)section {
return @"";
}
分区索引标题
- (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView {
return @[@"A", @"B", @"C"];
}
设置代理, 检测tableView
tableView.delegate = self;
#pragma mark - UITableViewDelegate
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
NSLog(@"%ld %ld", indexPath.section, indexPath.row);
DetailViewController *detailVC = [[DetailViewController alloc] init];
//赋值
detailVC.person = self.personArray[indexPath.section][indexPath.row];
[self.navigationController pushViewController:detailVC animated:YES];
[detailVC release];
}
@end
DetailViewController.m #import "DetailViewController.h" #import "Person.h" @interface DetailViewController () @end @implementation DetailViewController - (void)dealloc { [_person release]; [super dealloc]; } - (void)viewDidLoad { [super viewDidLoad]; self.view.backgroundColor = [UIColor colorWithRed:0.632 green:1.000 blue:0.968 alpha:1.000]; self.name 和 _name 的使用场景 1.赋值时, 使用self.name = @"zhangsan", self.name会调用setter方法, setter方法内部会处理(retain, copy); 2.取值时, 使用_name, 如果使用self.name, 会调用getter方法, getter方法返回_name, 和直接使用_name是一样, 并且直接使用_name效果会更高一些 self.navigationItem.title = @"联系人"; UILabel *nameLabel = [[UILabel alloc] initWithFrame:CGRectMake(50, 100, 275, 40)]; nameLabel.backgroundColor = [UIColor whiteColor]; nameLabel.text = [NSString stringWithFormat:@" 姓名: %@", _person.name]; [self.view addSubview:nameLabel]; [nameLabel release]; UILabel *phoneLabel = [[UILabel alloc] initWithFrame:CGRectMake(50, 170, 275, 40)]; phoneLabel.backgroundColor = [UIColor whiteColor]; phoneLabel.text = [NSString stringWithFormat:@" 电话: %@", _person.teleNumber]; [self.view addSubview:phoneLabel]; [phoneLabel release]; } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } @end
UITableView的创建
1.开辟空间, 设置frame, 指定样式
2.设置属性(行高, 分隔线, 表头, 表尾)
3.添加到父视图
4.释放
UITableView的结构
一个UITableView有一个tableHeaderView, 一个tableFooterView, 多个section
一个section有多个UITableViewCell, 一个区头, 一个区尾
一个UITableViewCell有contentView和accessoryView, 其中contentView有imageView, textLabel, detailTextLabel
UITableView, 如何展示数据
1.设置dataSource
2.遵守协议<UITableViewDataSource>
3.实现协议方法, 其中有连个方法是required(分区行数, cell的创建)
通过重用机制创建cell
1.重用标识符(static)
2.tableView根据重用标识符去复用池中找cell
3.判断是否找到cell, 如果没有找到cell, 就创建cell
4.cell展示数据
5.返回cell
UITableViewDataSource中的方法
1.分区个数
2.分区的行数
3.创建cell
4.区头标题
5.区尾标题
6.分区索引标题
UITableViewDelegate中的方法
1.选中某一行
如何为UItableView提供数据源
数组 + 字典 + 自定义类
注: 当数据源发生变化时, tableView不会跟着改变, 需要重新加载tableView(reloadData)