UITableView学习总结1:基本用法

UITableView学习总结

展示数据

UITableView是IOS开发中用的最多的组件之一,相当于Android的ListView,用来展示大量的列表数据。

UITableView的特点

UITableView需要一个数据源来展示数据,系统会提供这个数据源方法:dataSource

  • UITableView的会请求数据源,得到数据,如多少行,每行显示什么
  • 没有dataSource,UITableView球都不是
  • 凡是遵守UITableViewDataSource协议的OC对象,都可以是UITableView的数据源

两种样式

UITableView可以展示两种样式
,你只需要改变它的Style即可。

  • Style
    • Plain
    • Grouped

而在Android中,需要用ListView和ExpandableListView两种控件来完成,前段时间刚做了个Android项目,感觉很蛋疼,如果是IOS就简单多了,也不用写什么适配器。

填充内容

遵守UITableView协议后,必须重写两个方法

Plain

@required

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

// Row display. Implementers should *always* try to reuse cells by setting each cell's reuseIdentifier and querying for available reusable cells with dequeueReusableCellWithIdentifier:
// Cell gets various attributes set automatically based on table (separators) and data source (accessory views, editing controls)

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

Grouped

如果是Grouped,得重写3个方法,需要多加一个分组方法,设置有多少组

/**
 * 设置TableView中有多少组数据
 */
-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{
    
    return 2;
}

设置显示内容样式

- (UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

在初始化Cell的时候,系统提供了几种常用的样式:

  • UITableViewCellStyleSubtitle
  • UITableViewCellStyleValue1
  • UITableViewCellStyleValue2
  • UITableViewCellStyleDefault

当然,默认样式可以忽略,直接init就行了- -!


- (UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
    
    //初始化的时候加载样式
    UITableViewCell *cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:nil];
    //设置第几组
    if(indexPath.section==0){
        //设置第几行
        if(indexPath.row==0){
            //标题
            cell.textLabel.text = @"奥迪";
            //图片
            cell.imageView.image = [UIImage imageNamed:@"img01"];
            //详细信息
            cell.detailTextLabel.text = @"这是一辆奥迪";
        }else if(indexPath.row==1){
            cell.textLabel.text = @"奔驰";
        }else if(indexPath.row==2){
            cell.textLabel.text = @"宝马";
        }
        
    }

设置分组标题

其实就是设置Header和Footer

  • title里面有两个方法
    • Header 在组的头部,可以理解为标题
    • Footer 在组的尾部,可以理解为尾部标题或者描述
/**
 * 设置分组标题
 */
-(NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section{
    return  @"德系车";
}

/**
 * 设置分组描述
 */
- (NSString *)tableView:(UITableView *)tableView titleForFooterInSection:(NSInteger)section{
    return @"大众车,为大众";
}


UITableView显示数据步骤

  • 设置dataSource数据源
  • 数据源要遵守UITableViewDataSource协议
  • 数据源要实现协议中的方法
  • 具体实现

UITableView设置代理

如果是纯粹的显示数据,上面的就足够了,有时候我们需要实现和ListView(列表)差不多的效果,而且需要每个cell都可以点击,那么就需要去实现它的监听方法了。

  • 首先,需要设置代理
@interface ViewController ()<UITableViewDataSource,UITableViewDelegate>

- (void)viewDidLoad {
    [super viewDidLoad];
    //设置代理
    self.tableView.delegate = self;
    //注册标识符对应的cell类型
    [self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:ID];
}
  • 其次,你需要啥就监听啥吧
  • 话不多说,上代码
//选中事件
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
    NSLog(@"click-%zd",indexPath.row);
}
//取消事件
-(void)tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath{
    NSLog(@"unclick-%zd",indexPath.row);
}
//行高,比如高度是根据内容决定的时候,可能会用到这个方法
-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
    if(indexPath.row%2==0){
        return 70;
    }
       return tableView.rowHeight;
}
//Plain下的header and footer
-(NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section{
   
        return @"header";
}
-(NSString *)tableView:(UITableView *)tableView titleForFooterInSection:(NSInteger)section{
    return @"footer";
}
//Group下的header and footer,第section组显示什么样的控件
-(UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section{
    return [UIButton buttonWithType:UIButtonTypeContactAdd];
}
-(UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section{
    return [UIButton buttonWithType:UIButtonTypeInfoLight];
}
  • IOS提供的东西太特么多了,常用的就上面几个了,有一些奇葩需求的,也可以去delegate里面找一找。

UITableViewController

前面的东西需要自己写很多东西,但是这个UITableViewController直接就帮我们创建好了一切,什么都不用动,开始动手写吧

创建步骤

  1. 创建一个类,继承自UITableViewController
  2. 什么都不需要设置,不需要设置什么代理和数据源之类的,IOS已经都设置好了
  3. 删掉没用的,留下有用的,实现需要的,比如cell需要我们自己实现
  4. 创建一个控制器,绑定到我们刚创建的控制器类
  5. 然后随便写一写就可以用了
//只需要写一下这个,其他都不用管,直接就可以用了,动手试试吧
- (UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
    //定义标识符
    static NSString *ID = @"cell";
    //缓存池查找数据
    UITableViewCell*cell = [tableView dequeueReusableCellWithIdentifier:ID];
    //判空,如果没有就根据id初始化
    if(cell == nil){
        cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:ID];
    }
    //设置数据
    cell.textLabel.text = [NSString stringWithFormat:@"第 %zd 行",indexPath.row];
//    NSLog(@"第 %zd 行",indexPath.row);
    return cell;
}

这个东西感觉还是蛮不错的。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 195,980评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,422评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 143,130评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,553评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,408评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,326评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,720评论 3 386
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,373评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,678评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,722评论 2 312
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,486评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,335评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,738评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,009评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,283评论 1 251
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,692评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,893评论 2 335

推荐阅读更多精彩内容

  • 概述在iOS开发中UITableView可以说是使用最广泛的控件,我们平时使用的软件中到处都可以看到它的影子,类似...
    liudhkk阅读 8,914评论 3 38
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 11,952评论 4 60
  • 序引 本系列文章将介绍iOS开发中的UITableView控件,将会分成四篇文章完整的讲述UITableView的...
    yetCode阅读 2,254评论 3 40
  • 1.CEO:是Chief Executive Officer的缩写,即首席执行官。 由于市场风云变幻,决策的速度和...
    零一间阅读 1,038评论 0 0
  • 中考,在一次次紧张的讲话,一次次焦急的四目相对中过去。 而我,再也无法穿着校服,与你假装相遇,再也无法用同学关系和...
    秋芜树阅读 1,193评论 0 2