/*
简化版
uitableview 显示数据方法
1.设置数据源对象。2 让数据源对象遵守数据源方法UItabelviewDatasouce。3:在数据源对象中必须实现UItabelviewDatasouce某些特定的方法,这些方法的意思就是告诉tableview如何显示数据。4:当tabelview 运行起来的时候,数据源方法不断地告诉tabelview显示什么数据
*/
//设置数据源对象
self.tv.dataSource=self;
//在数据源对象中一般实现的方法
}
//1.告诉UItableview显示几组
-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{
//默认是一组,所以展示的就是一组数据
return 1;
}
//2.告诉tableView每一组显示几行数据
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
//如果有多组的话并且每组里的行数也不相同可以
//都是为了演示一下
// if(section==0){
// return 3;
// }else if(section==1){
// return 2;
// }else if(section==2){
// return 1;
// }
return 2;
}
//3.告诉tableView的每一组的每一行显示什么内容的单元格
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
//这里面基本上都是1.获取模型数据2.创建单元格uitableviewcell3.把模型中的数据设置给单元格中的子控件 4.返回单元格uitableviewcell
//如果有多组的话进行判断
// if(indexPath.section==0){
//
// }else if (indexPath.section==1){
//
// }else if (indexPath.section==2){
//
//
// }
//传建一个单元格对象并且返回
UITableViewCell *cell=[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:nil];
//为单元格设置数据
cell.textLabel.text=@"大家好";
//cell.imageView给cell设置图片框
//表示当前是第几组
//indexPath.section;
//表示当前是第几行
//indexPath.row;
return cell;
}
//每一组的组标题显示什么
-(NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section{
//根据当前组的索引返回当前的组标题
//这都是为了演示
if(section==0){
return @"亚洲";
}else if (section==1){
return @"非洲";
}else{
return 0;
}
}
//每一组的组尾巴显示什么
-(NSString *)tableView:(UITableView *)tableView titleForFooterInSection:(NSInteger)section{
//这都是为了演示
return 0;
}
-(instancetype)initWithDict:(NSDictionary *)dict{
if(self=[super init]){
[self setValuesForKeysWithDictionary:dict];
}
return self;
}
-(NSMutableArray *)groop{
if(_groop==nil){
//懒加载数据
//找到plist文件路径
NSString *path=[[NSBundle mainBundle]pathForResource:@"" ofType:@""];
//加载 plist文件
NSArray *arr=[NSArray arrayWithContentsOfFile:path];
//吧字典转换成模型
NSMutableArray *arr_model=[NSMutableArray array];
//遍历字典中每个字典,把每个地点转换成模型,吧模型放到arr_model中
for (NSDictionary *dict in arr_model) {
//Model *model=[[Model alloc]initWithDict:dict];
}
//[arr_model addObject:model];
}
return _groop;
//设置单元格右侧有个按钮样式的东西(默认系统的哪几种样式)
cell.accessoryType=UITableViewCellAccessoryCheckmark;
//设置单元格右侧有个按钮样式的东西(自定义样式)
cell.accessoryView=[[UISwitch alloc]init];
表用于显示数据列表,数据列表中的每一项都由行表示。IOS没有行的限制,行数仅受可用才存储空间的限制,IOS的表只有一列。
表视图是显示表数据的试图对象,是UITableView类的一个实例,表中的每个可建行都有UITableViewCell类实现。即一个UITableView实例由若干UITableViewCell组成。
表视图不负责存储表中的所有数据,只存储足够绘制当前可见行的数据。每次只加载一屏幕的数据。表视图从遵循UITableViewDelegate协议的对象中获取配置数据,从遵循UITableViewDataSource协议的对象中获得行数据。
1. 首先,Controller需要实现两个 delegate ,分别是 UITableViewDelegate 和 UITableViewDataSource
2.然后 UITableView对象的 delegate要设置为 self。
3. 然后就可以实现这些delegate的一些方法。
(1)- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView;
这个方法返回 tableview 有多少个section
//返回有多少个Sections
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
return array.Count; //默认值为1
}
(2)- (NSInteger)tableView:(UITableView *)table numberOfRowsInSection:(NSInteger)section;
这个方法返回对应的section有多少个元素,也就是多少行。
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return 10; //默认也是1 ,分区中的行的个数
}
(3)-(UITableViewCell *)tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;
返回指定的row 的cell。这个地方是比较关键的地方,一般在这个地方来定制各种个性化的 cell元素。这里只是使用最简单最基本的cell 类型。
其中有一个主标题cell.textLabel 还有一个副标题cell.detailTextLabel, 还有一个 image在最叫cell.imageView. 还可以设置右边的图标,通过cell.accessoryType 可以设置是饱满的向右的蓝色箭头,还是单薄的向右箭头,还是勾勾标记。
//设置每行调用的cell
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *SimpleTableIdentifier = @"SimpleTableIdentifier";//自定义的标识符
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:
SimpleTableIdentifier];
if (cell == nil) {
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault
reuseIdentifier: SimpleTableIdentifier] autorelease];
}
cell.imageView.image=image;//未选cell时的图片
cell.imageView.highlightedImage=highlightImage;//选中cell后的图片
cell.text=@”测试文本”;
//设置单元格右侧有个按钮样式的东西
cell.accessoryType=UITableViewCellAccessoryCheckmark;
//设置单元格右侧有个按钮样式的东西(自定义样式)
cell.accessoryView=[[UISwitch alloc]init];
return cell;
}
表中的每一行都代表一个UITableViewCell。可以使用图像、文本还有辅助的图标等来自定义你自己的UITableViewCell。你可以自定义你自己的cell如下模型或者像appstore那样的。
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath;
这个方法返回指定的 row 的高度。
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section;
这个方法返回指定的 section的header view 的高度。
- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section;
这个方法返回指定的 section的footer view 的高度。
(4)- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section
返回指定的section的 header的title,如果这个sectionheader 有返回view,那么title就不起作用了。
- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section
{
if (tableView == tableView_)
{
if (section == 0)
{
return @"Girls";
}
else
{
return @"Boys";
}
}
}
(5)设置让UITableView行缩进
// 把每一行的缩进级别设置为其行号,第一行为1,第二行为2
-(NSInteger)tableView:(UITableView *)tableView indentationLevelForRowAtIndexPath:(NSIndexPath *)indexPath{
NSUInteger row = [indexPath row];
return row;
}
(6)设置cell每行间隔的高度
- (CGFloat)tableView:(UITableView *)tableView eightForRowAtIndexPath:(NSIndexPath *)indexPath{
return 40;
}
(7)设置选中Cell的响应事件
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
[tableView deselectRowAtIndexPath:indexPath animated:YES];//选中后的反显颜色即刻消失
}
该方法是选中之后执行。另一个方法willSelectRowAtIndexPath是在一行选择前调用,通常用来阻止某行的能否被选中
-(NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
if(row == 0)
return nil;//设置第一个可见行不能被选中
return indexPath;
}
图片说明:此图片是从其他网站上戒掉的部分图。和上述代码运行效果不大相同。