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)