UI基础之----UITableView 详解(初级)

一 UITabelView 基础属性

1.    表视图 UITableView,iOS中重要的视图.

表视图通常用来管理一组具有相同数据结构的数据.

2.    UITable 继承自UIScrollView, 所以可以滚动.

表视图的每一条数据都是显示在 UITableViewCell 对象中.

表视图的每一条数据都是显示在 UITableViewCell 对象中.

表视图可以分区显示数据,每个分区称为一个section,每一行称为 row, 编号都是从0开始.

3.    UITableView 可以有多个分区(section)[相当于我们班中的分组],每个分区里      又有很多行(row)[相当于分分组里的组员]

二 表视图的创建及显示数据

1.    创建 UITableView 对象

UITableView*tableView = [[UITableView alloc]initWithFrame:[UIScreen mainScreen].boundsstyle:UITableViewStylePlain];

    表视图的style有两种样式:UITableViewStylePlain         

                   UITableViewStyleGrouped(主要用于分组)

2.    设置表的行高

tableView.rowHeight =80;

3.    设置表分割线颜色

tabelView.separatorColor= [UIColor brownColor];

4.    设置分割线的样式

tableViewseparatorStyle= UITableViewCellSeparatorStyleSingleLine;(有三种样式)

5.    设置分割线的边界(上,左,下,右)逆时针的方向

tableView.separatorInset= UIEdgeInsetsMake(0,0,0,0);

6.    表视图的表头(tableHeaderView)

定义一个 UIView 对象;表头视图很重要,一般会在这里放置轮播图

UIView *view =[[UIView alloc]initWithFrame:CGRectMake(0,0,320,50)];

view.backgroundColor= [UIColor greenColor];

tableView.tableHeaderView = view; [view release];

7.     表视图的表尾(tableFooterView)

表头和表尾,当表里面没有内容的时候,只会显示表头视图和表尾视图.(紧挨在一起)

定义一个视图作为 cell 的下角

UIView *view =[[UIIView alloc]initWithFrame:CGRectMake(0,0,230,50)];

view.backgroundColor= [UIColor redColor];

tableView.tableFooterView= view;

[view release];

表视图如果没有内容,如何将那些没有内容的 Cell去除(快速去除的方法)

 tableView.tableFooterView = [[[UIView alloc]init]autorelease];

8.    表视图的数据源属性(VVIP)配置数据源代理

1>  指定数据源的代理对象

tableView.delegate =self;

2>   遵循数据源代理的协议

在类中

3>   实现数据源协议中的方法

①  配置tableView 每个分区对应的行数

-(NSInteger)tableView: (UITableView *)tableView numberOfRowsInSection

:(NSInteger)section;

②  用来创建每一行上的内容的方法(需要借助于 UITabelViewCell)

-(UITabelViewCell*)tableView: (UITableView *)tableView cellForRowAtIndexPath: (NSIndexPath*)indexPath;

③  NSIndexPath 继承自 NSobject,用于存储 cell 所在的存储分区和在分区中的行数(包括 section 和 row)

④  可以使用下面的方法进行查看

NSIndexPath *index = [NSIndexPath indexPathForRow:0 inSection:1];

NSLog(@”%ld %ld”,index.section,index.row);

⑤  如何重用创建的 cell, 而且节约内存呢?

表视图中提供了表视图的重用机制.(即出屏幕的 cell会被添加到 mutableSet,进入屏幕的 cell,先从 set中获取,如果获取不到,才创建一个 cell. cell 显示之前, cell赋上相应的内容)

cell reuseldentifier是重用的关键.

⑥  重用机制的具体实现过程:

1>  创建重用 cell 的标志

static NSString*indentifier = @”cell”; //静态去中的数据,第一次初始化之后,值不在改变

2>  根据重用标志去重用队列中取cell

    UITableViewCell *cell = [tableViewdequeueReusableCellWithIdentifier: indentifier];

3>  判断是否成功取到cell. 取到的 cell 一定带有标志的,也就是可重用的

if(!cell){ !cell表示取到的值为空

// 创建 cell 对象,这些 cell 都是有标志

cell =[[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleSubtitlereuseIdentifier : indentifier]autorelease];

内存问题:在哪里创建就在那个地方释放,因为当重用池中又 cell的时候,这个判断就不会在执行了,所以在 return cell的时候,不需要再 autorelease 了.

}

⑦  为 cell 添加图片(imageView)

cell.imageView.image= [UIImage imageNamed:@”0.png”];

⑧  为 cell 添加 lable

cell.detailTextLable.text= @”27班”;

⑨  指定 cell 被选中时的效果

cell.selectionStyle =UITableViewCellSelectionStyleDefault;

⑩  设置辅助视图的样式

cell.accessoryType =UITableViewCellAccessoryDisclosureIndicator;

数据源代理其余的方法

1>  配置 tableView 的分区数,返回值是几,就有几个分组,返回分区的个数

-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView;

2>   配置每个分区的页眉

-(NSString*)tableView: (UITableView *)tableView titleForHeaderInSection: (NSInteger)section;

3>  配置每个分区的页脚

-(NSString*)tableView: (UITableView *)tableView titleForFooterInSection: (NSInteger)section;

 4> 配置 tableView右侧的分区索引(返回一个数组)

-(NSArray *)sectionIndexTitlesForTableView: (UITableView *)tableViw{

return @[@” A”,@”B”,@”C”,@”D”,@”E”];

}

  业务代理方法(VIP)

1>  在创建UITableView对象的时候,设置业务代理对象(即在viewDidLoad方法中)

tableView.delegate =self;

2>   在类中遵循代理协议

3>   实现代理中常用的方法

①  当 tableView 的某一行被选中的时候触发.(主要作用是用来添加点击某一行时,跳转界面的功能),是比较常用的方法

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath: (NSIndexPath *)indexPath

②  当 tableView: 的某一行取消选中的时候会被触发

- (void)(UITableView*)tableView didDeselectRowAtIndexPath: (NSIndexPath *)indexPath;

③  返回每一页分组的高度(使用if…….else if…..进行判断)

-(CGFloat)tableView: (UITableView *)tableViewheightForRowAtIndexPath: (NSIndexPath *)indexPath;

代码如下:

#import "RootViewController.h"
#import "DetailViewController.h"
@interface RootViewController ()
#warning 设置数据源对象第三步:   遵循数据源协议
#warning 设置代理第二步, 遵循代理协议
@property (nonatomic,retain) NSArray *bigArray;
@property (nonatomic,retain) NSDictionary *dictionary;
@property (nonatomic,retain) NSArray *key;
@end

@implementation RootViewController
- (void)viewDidLoad {
    [super viewDidLoad];
    //self.view.backgroundColor = [UIColor redColor];
    // 定义数组
    NSArray *array = @[@"李鲲鹏",@"李学良",@"李晨迪"];
    NSArray *array1 = @[@"陈晨",@"陈辰",@"陈殿名",@"陈冠希"];
    NSArray *array2 = @[@"王辉",@"王亮",@"王二小",@"王宝强"];
    self.bigArray = @[array,array1,array2];
    
    // 定义字典
    // 创建字典的时候,使用语法糖 的格式@{key:value,key1:value1,key2:value2}
    self.dictionary = @{@"L":array,@"C":array1,@"W":array2};
    
    // 取出字典中的所有 key 值,存放到数组中
    NSArray *keyArray = [self.dictionary allKeys];
    
    // 将取出的 key 值排序
    self.key = [keyArray sortedArrayUsingSelector:@selector(compare:)];
    
    /*UITableView是iOS 中提供用来展示数据视图的视图.叫做表视图,但是只有一列,而且只能在垂直方向滑动,继承自 UIScrollView
     UITableView 可以有多个分区(section)[相当于我们班中的分组],每个分区里又有很多行(row)[相当于分组里的组员]
     */
    // 1.创建 UITableView 对象
    UITableView *tableView = [[UITableView alloc]initWithFrame:[UIScreen mainScreen].bounds style:UITableViewStylePlain];
    //tableView.backgroundColor = [UIColor redColor];
    // 2.设置属性
    // 2.1设置行高
    tableView.rowHeight = 80;
    // 2.2设置分割线的样式
    tableView.separatorColor = [UIColor brownColor];
    // 2.3设置分割线的样式
    tableView.separatorStyle = UITableViewCellSeparatorStyleSingleLine;
    // 2.4设置分割线边距(上,下,左,右)逆时针方向
    tableView.separatorInset = UIEdgeInsetsMake(0, 0, 0, 0);
    
    //2.5 ============表视图===============
    // 表视图很重要,一般会在这里放置轮播图
    // 创建一个 UIView视图对象
    UIView *view = [[UIView alloc]initWithFrame:CGRectMake(0, 0, 320, 50)];
    // 给UIView 视图添加背景色
    view.backgroundColor = [UIColor greenColor];
    // 将创建的视图做为 tableView 的表头(tableHeaderView)属性
    tableView.tableHeaderView = view;
    [view release];
    
    // 2.6============表尾视图==============
    // 表尾,表头,如果表里面没有内容,只会显示表头视图和表尾视图
    // 定义一个视图作为cell 的表尾
    
//    UIView *footView = [[UIView alloc]initWithFrame:CGRectMake(0, 0, 320, 50)];
//    // 给视图添加背景颜色
//    footView.backgroundColor = [UIColor redColor];
//    // 将创建的视图 footView 作为tableView 的表尾(tableFootView属性)
//    tableView.tableFooterView = footView;
//    [footView release];
    
    // 表尾如果没有内容.如何将那些没有内容的 cell 去除
    // 快速去除方式
    //tableView.tableFooterView = [[[UIView alloc]init]autorelease];
    
    //=========数据源属性===========
    // VVIP 配置数据源代理
#warning  设置数据源对象第一步:设置数据源对象
    tableView.dataSource = self;
    
    //=========代理属性============
#warning 设置代理第一步, 设置代理对象
    // VIP 代理
    tableView.delegate = self;
    
    [self.view addSubview:tableView];
    [tableView release];
    
}
#pragma mark ----------- UITableViewDataSouce实现协议的方法----------------
#warning 必须实现的方法
// 配置 tableView 每个分区对应的行数
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
#warning 从数组中获取行数
       // 1.计算分区对应的行数   方法一
   /* {
        if (0 == section) {
            NSArray *tempArray = self.bigArray[0];
            return tempArray.count;
            // 也可以直接 return [self.bigArray[0] count];
        }else if (1 == section){
            NSArray *tempArray = self.bigArray[1];
            return tempArray.count;
            //  return [self.bigArray[1] count];
        }else{
            NSArray *tempArray = self.bigArray[2];
            return tempArray.count;
            //  return [self.bigArray[2] count];
        }
    }  */
    // 2.计算分区方法    方法二
//    NSArray *tempArray = self.bigArray[section];
//    return tempArray.count;
    
#warning 字典中取出数据
    // 方法一:
   /* {
    if (0 == section) {
        // 先取出排序后数组中的key 值
        NSString *key = self.key[0];
        // 使用 key 值取出 字典中 key 值对应的 value 值
        NSArray *keyArray = [self.dictionary objectForKey:key];
        return  keyArray.count;
        // return [self.dictionary[key] count];
    }else if(1 == section){
        NSString *key = self.key[1];
        return [self.dictionary[key] count];
    }else{
        NSString *key = self.key[2];
        return [self.dictionary[key] count];
    }
    }*/
    // 方法二:
    // 1.从排好的数组中取出 key 值
    NSString *key = self.key[section];
    
    // 2.从字典中根据 key 值,取出对应的 value(数组)
    return [self.dictionary[key] count];
    
}
// 用来创建 cell
static int i = 0;   // 用来记录 cellForRowAtIndexPath 走的次数
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
   // NSIndexPath 继承自 NSObject,用于存储 cell 所在的存储分区和在分区中的行数(包括 section 和 row)
   // 使用下面的方法查看(section 和 row),打印结果中 length 是分组的个数
//    NSIndexPath *index = [NSIndexPath indexPathForRow:0 inSection:1];
//    NSLog(@"%ld %ld",index.section,index.row);
    
    // 创建 UITableViewCell 对象
    /*
    即出屏幕的 cell 会被添加到 mutableSet 中,进入屏幕的 cell, 先从 set 中获取,如果获取不到,才创建一个 cell.在 cell 显示之前,给 cell 赋上相应的内容)
    cell 的 reuseldentifier 是重用的关键.
     */// 为了节约内存,采用了表视图的重用机制
    //如何重用 cell?
    // 1.创建重用 cell 的标志
    static NSString *indentifier = @"cell";  // 静态区的数据,第一次初始化之后,值不再改变
    // 2.根据重用标志去重用池中取cell
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:indentifier];
    // 3.判断是否成功取到 cell         取到的 cell 一定是带有标志的,也就是可重用的
    if (!cell) {        // !cell表示取到的值为空
        // 4. 创建 cell 对象,这些 cell 都是有标志的
        // 内存问题:在哪里创建就在那个地方释放,因为当重用池中有 cell 的时候,这个判断就不会再执行了,所以在 return cell 时候不需要再 autorelease 了
        cell = [[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:indentifier]autorelease];
        NSLog(@"创建了%d次",++i);  // 用来记录加载界面的时候,创建 cell 的次数
    }
    
#warning 从大数组中取出数据
    /* {
    // 取出小数组中的数据(名字),让 textLable 显示
        // 根据分区索引获取小数组
        NSArray *tempArray = self.bigArray[indexPath.section];
        // 根据行索引,获取小数组中对应的元素
        cell.textLabel.text = tempArray[indexPath.row];
    } */
    
#warning 从字典中取出数据
    // 1.从排好序的数组中取出 key 值
    NSString *key = self.key[indexPath.section];
    // 2.根据 key 值在字典中获取对应的 value
    NSArray *tempArray = self.dictionary[key];
    // 3. 根据获得的数组取出数据
    NSString *name = tempArray[indexPath.row];
    // 4.给 textLable赋值
    cell.textLabel.text = name;
    
    
    // 为 cell 添加图片
    cell.imageView.image = [UIImage imageNamed:@"0.png"];
    // 为 cell 添加 lable
    cell.detailTextLabel.text = @"27班";
    // 添加 cell被选中时的效果
    cell.selectionStyle = UITableViewCellSelectionStyleDefault;
    // 添加cell 的辅助视图
    cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
    return cell;
}
// 配置 tableView 的分区数,返回值是几,就有几个分组,返回分区的个数
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{
  #warning  大数组中的元素的个数等于分区的个数
   // return self.bigArray.count;
 #warning 字典中键值对的个数等于分区的个数
    return self.dictionary.count;
}

// 配置每个分区的页眉

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section{
return @"123";
}

// 配置每个分区的页脚
//- (NSString *)tableView:(UITableView *)tableView titleForFooterInSection:(NSInteger)section{
 一般不需要
//}
// 配置 tableView 右侧的分区索引
- (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView{
    return @[@"A",@"B",@"C",@"D",@"E",@"F",@"G",@"H",@"I",@"J",@"K",@"L",@"M",@"N",@"O",@"P",@"Q",@"R",@"S",@"T"];
}


#pragma mark         -------业务代理的方法------------
#warning 一般用来实现界面的跳转功能
// 当tableView 的某一行被选中时触发
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
    DetailViewController *detail = [[DetailViewController alloc]init];
    [self.navigationController pushViewController:detail animated:YES];
    [detail release];
}
// 当 tableView 的某一行取消选中会触发
- (void)tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath{
    NSLog(@"deselect section:%ld,row:%ld",indexPath.section,indexPath.row);
}
// 返回每一分组的高度
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
    if (0 == indexPath.section) {
        return 100;
    }else if (1 == indexPath.section ){
        return 80;
    }
    return 60;
}

- (void)dealloc
{
    [_key release];
    [_dictionary release];
    [_bigArray release];
    [super dealloc];
}



- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    
}


@end


你可能感兴趣的:(UI)