简单描述UITableView

  • 在iOS开发中UITableView可以说是使用最广泛的控件,我们平时使用的软件中到处都可以看到它的影子,类似于微信、QQ、新浪微博等软件都有用到UITableView。

UITableView的创建

  #import "ViewController.h"
  // 定义一个宏作为cell的重用池
  #define kTableViewCellReuse @"reuse"
  @interface ViewController ()<UITableViewDelegate, UITableViewDataSource> // tableView的两个协议
  @end
  @implementation ViewController
  - (void)viewDidLoad {
        [super viewDidLoad];
        //  创建tableView, 并让其与屏幕大小一样
        UITableView *tableView = [[UITableView alloc] initWithFrame:[UIScreen mainScreen].bounds style:UITableViewStyleGrouped];
        [self.view addSubview:tableView];
        tableView.delegate = self;
        tableView.dataSource = self;
        // 注册tableViewCell
        [tableView registerClass:[UITableViewCell class]   forCellReuseIdentifier:kTableViewCellReuse];
  }
  #pragma mark - tableView的dataSource协议
  // 使其具有五个分区
  - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
        return 5;
  }
  // 每个分区里面含有五个cell
  - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
      return 5;
  }
  // 在这个协议方法里面给cell赋值
  - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
      UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:kTableViewCellReuse];
      cell.textLabel.text = @"这是一个cell";
      return cell;
  }

tableView的创建需要设置两个参数, 一个是frame, 我们就不多说了, 还有一个是style, 这个style是个枚举, 它总共有两种style, 如下所示。

typedef NS_ENUM(NSInteger, UITableViewStyle) {
    UITableViewStylePlain,          // regular table view
    UITableViewStyleGrouped         // preferences style table view
};

下面两张图分别表示了UITableViewStylePlain和UITableViewStyleGrouped的显示样式

UITableViewStylePlain.png
UITableViewStyleGrouped.png

UITableView的头视图和尾视图

     // 创建头视图View
    UIView *headView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.view.bounds.size.width, 100)];
    headView.backgroundColor = [UIColor redColor];
    // 创建尾视图View
    UIView *footView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.view.bounds.size.width, 100)];
    // 将两个View分别放在头视图和尾视图上
    tableView.tableHeaderView = headView;
    tableView.tableFooterView = footView;

效果图如图所示, 一般我们都是在头视图上添加轮播图等...

红色部分即为tableView的头视图
如图的蓝绿色即为tableView的尾视图

UITableViewCellStyle

  • UITableView中每行数据都是一个UITableViewCell,在这个控件中为了显示更多的信息,iOS已经在其内部设置好了多个子控件以供开发者使用。
  • 如果我们查看UITableViewCell的头文件就可以发现在其内部有一个UIView控件(contentView,作为其他元素的父视图)、两个UILable控件(textLabel、detailTextLabel)、一个UIImage控件(imageView),分别用于容器、显示内容、详情和图片。
  • 这些控件不一定要使用, 因为我们可以自定义tableViewCell来实现一些系统做不了的事情, 这些控件的布局属性有UItableViewCellStyle进行设置.比如以下代码.
 UITableViewCell *cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:@"reuse"];
  • 上面的代码是UITableViewCell的初始化方法, 可以通过其设置UITableViewCellStyle, 它是一个枚举值:
typedef NS_ENUM(NSInteger, UITableViewCellStyle) { 
UITableViewCellStyleDefault, // 左侧显示textLabel(不显示detailTextLabel),imageView可选(显示在最左边) 
UITableViewCellStyleValue1, // 左侧显示textLabel、右侧显示detailTextLabel(默认蓝色),imageView可选(显示在最左边) 
UITableViewCellStyleValue2, // 左侧依次显示textLabel(默认蓝色)和detailTextLabel,imageView可选(显示在最左边)
 UITableViewCellStyleSubtitle // 左上方显示textLabel,左下方显示detailTextLabel(默认灰色),imageView可选(显示在最左边) 
};

下面介绍几个常用的tableView的协议方法

#pragma mark - 设置每行高度(每行高度可以不一样, 通过判断实现)
 -(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { 
    return 45;
 } 
#pragma mark - 设置尾部标题内容高度
 -(CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section { 
    return 40; 
}
#pragma mark - 返回每组头标题名称
-(NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section{
    NSString *headTitle = [NSString stringWithFormat:@"第%ld个分区的头视图", section];
    return headTitle;
}
#pragma mark - 返回每组尾部说明
-(NSString *)tableView:(UITableView *)tableView titleForFooterInSection:(NSInteger)section{
    NSString *footTitle = [NSString stringWithFormat:@"第%ld个分区的尾视图", section];
    return footTitle;
}
#pragma mark - 返回每组标题索引
-(NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView{
    NSMutableArray *indexsArray = [[NSMutableArray alloc]init];
    indexsArray = @[@"A", @"B", @"C", @"D", @"E"].mutableCopy;
    return indexsArray;
}
#pragma mark - 设置分组头视图标题内容高度
-(CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section{
    // 通过section的不同可以设置每个头视图标题的高度
    if(section==0) {
        return 50;
    }
    return 40;
}
#pragma mark - 设置每行(Row)的高度(每行高度可以不一样)
-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
    return 45;
}
#pragma mark - 设置尾部说明内容高度(每个尾视图高度可以不同)
-(CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section {
    return 40;
}
#pragma mark - tableView的点击方法
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
    NSLog(@"点击了第%ld分区的第%ld个cell", indexPath.section, indexPath.row);
}

设置每个分区头视图和尾视图的View

#pragma mark - 返回每组尾视图的View
- (UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section {
    UIView *footView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, 50)];
    footView.backgroundColor = [UIColor greenColor];
    UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, 50)];
    label.text = @"这个是每个分区的尾视图的label";
// 判断当第一个分区的时候, 显示的是footView, 其它的是label
    if (section == 0) {
        return footView;
    } else {
    return label;
    }
}
#pragma mark - 返回每组头视图的View
- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {
    UIView *headView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, 50)];
    headView.backgroundColor = [UIColor blueColor];
    UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, 50)];
    label.text = @"这个是每个分区的头视图的label";
// 判断当第一个分区的时候, 显示的是headView, 其它的是label
    if (section == 0) {
        return headView;
    } else {
        return label;
    }
}

下面我们看一下效果

tableView的头视图和尾视图自定义view.gif

就写到这里了, 希望有错误的大家指出, 互相学习互相进步, 以后我还会对应的写一些关于UITableView的内容, 欢迎大家一起讨论学习。

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

推荐阅读更多精彩内容

  • 概述在iOS开发中UITableView可以说是使用最广泛的控件,我们平时使用的软件中到处都可以看到它的影子,类似...
    liudhkk阅读 8,982评论 3 38
  • *7月8日上午 N:Block :跟一个函数块差不多,会对里面所有的内容的引用计数+1,想要解决就用__block...
    炙冰阅读 2,468评论 1 14
  • 1.nav1.navigationBar.barStyle=UIBarStyleBlack; //改变导航栏背景颜...
    SadMine阅读 1,548评论 1 4
  • 1.DOM0 事件和DOM2级在事件监听使用方式上有什么区别? 在DOM0级事件处理程序,事件名以'on'开头,如...
    leocz阅读 207评论 0 0
  • 老子云“四体不勤五谷不分,孰为夫子?”,看来在老子眼中,会种地是夫子的必备条件。 我来自农村,早年在寒暑...
    李磊1026阅读 742评论 0 1