课程要点:

  • UITableView及其两种风格和三部分
  • UITableViewController
  • UITableViewCell及其四种风格
  • 通过代理给UITableView设置cell
  • 性能优化
  • tableView的其他代理方法

UITableView及其两种风格和三部分

UITableView是一个能滑动,能够承载多个单元格的视图控件,例如下图:能够滑动的是tableView,上面的每一条新闻都放在一个cell里面。

UITableView有两种风格

1、UITableViewStylePlain(普通风格)

2、UITableViewStyleGrouped(分组风格)

    //在设置frame的同时设置一种风格,现在先选择普通风格,后面讲到段的时候会用效果来展示两者的不同
UITableView *tableView = [[UITableView alloc]initWithFrame:CGRectMake(, , , ) style:UITableViewStylePlain];
    tableView.backgroundColor = [UIColor grayColor];

    [self.view addSubview:tableView];

UITableView由三部分组成

1、表头

2、UITableViewCell(单元格)

3、表尾

    //给tableView设置表头
tableView.tableHeaderView = [self addHeaderView];
//给tableView设置表尾
tableView.tableFooterView = [self addFooterView];

PS:设置表头和表尾是通过点属性来设置的,都需要赋值一个View,所以自己写了两个返回值是View的方法来设置表头和表尾的试图,如果将某个试图作为表头或者表尾,该试图的x,y,width都按照tableView默认的来,只有height会变成表头或表尾的高。

//设置表头
- (UIView *)addHeaderView{ UILabel *label = [[UILabel alloc]initWithFrame:CGRectMake(, , , )]; label.text = @"表头"; label.backgroundColor = [UIColor yellowColor]; return label;
} //设置表尾
- (UIView *)addFooterView{ UILabel *label = [[UILabel alloc]initWithFrame:CGRectMake(, , , )]; label.text = @"表尾"; label.backgroundColor = [UIColor yellowColor]; return label;
}

运行效果如下:

PS:此时只有表头和表尾,中间没有UITableViewCell(单元格)。这是因为目前我只给他设置了表头和表尾,并未设置单元格。

UITableViewController

每个控制器都自带一个视图,UITableViewController自带的试图是一个TableViewController。如果一个页面只有TableView的话可以采用这种控制器。自己可以私下尝试一下。这里不做过多解释了。

UITableViewCell及其四种风格

cell自带textLabel、detailTextLabel、imageView 不同风格的cell,这三种控件的摆放位置不同

1、UITableViewCellStyleDefault

图片居左,textlabel在图片右边,detailTextLabel默认不显示

2、UITableViewCellStyleValue1

图片居左,textlabel在图片的右边,detailTextLabel居右

3、UITableViewCellStyleValue2

左边一个主标题textLabel,挨着右边一个副标题detailTextLabel

4、UITableViewCellStyleSubtitle

图片居左,textLabel在图片的右边,deetailTextlabel在textlabel的下方。

将viewDidiLoad里的代码都给注释了,然后在ViewDidLoad中调用这个方法。

  //addTableViewCell方法是我自己写的,在这个方法内我将创建好的cell放到self.view上面
[self addTableViewCell];

实现addTableViewCell方法

- (void)addTableViewCell{

    //UITableCell也是一种试图空间,在这里初始化的同时给cell设置风格和标识符
UITableViewCell *cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:@"cellID"]; cell.frame = CGRectMake(, 150, , ); cell.backgroundColor = [UIColor brownColor]; [self.view addSubview:cell]; //cell自带textLabel、detailTextLabel、imageView 不同风格的cell,这三种控件的摆放位置不同 /*
* UITableViewCellStyleDefault
图片居左,textlabel在图片右边,detailTextLabel默认不显示 * UITableViewCellStyleValue1
图片居左,textlabel在图片的右边,detailTextLabel居右 * UITableViewCellStyleValue2
左边一个主标题textLabel,挨着右边一个副标题detailTextLabel * UITableViewCellStyleSubtitle
图片居左,textLabel在图片的右边,deetailTextlabel在textlabel的下方。
*/ cell.textLabel.text = @"张三";
cell.textLabel.textColor = [UIColor redColor];
cell.detailTextLabel.text = @"张三是张家人";
cell.imageView.image = [UIImage imageNamed:@"zhangsan.png"]; //右边出现小箭头
cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator; //圈i加箭头
cell.accessoryType = UITableViewCellAccessoryDetailDisclosureButton; //对号
cell.accessoryType = UITableViewCellAccessoryCheckmark; //圈i
cell.accessoryType = UITableViewCellAccessoryDetailButton; }

运行效果如下:

通过代理给UITableView设置cell

PS:之前我们学习了两种控件,UITableView和UITableViewCell,他两之间的关系应该是UITableView中有很多排列的UITableViewCell。接下俩我们要做的就是通过代理将两者给关联起来。

将viewDidLoad中的内容恢复至此:

    UITableView *tableView = [[UITableView alloc]initWithFrame:CGRectMake(, , , ) style:UITableViewStylePlain];

    //给tableView设置表头
tableView.tableHeaderView = [self addHeaderView];
//给tableView设置表尾
tableView.tableFooterView = [self addFooterView]; tableView.backgroundColor = [UIColor grayColor]; [self.view addSubview:tableView];

本模块的标题已经说明咱们是通过代理方法来设置cell。

1、遵守协议

//这两个协议分别有不同的方法
@interface ContactViewController()<UITableViewDataSource,UITableViewDelegate>

@end

2、挂代理

tableView.delegate = self;
tableView.dataSource = self;

3、实现代理方法,给tableView设置cell,有两个属性是必须的

1)tableView里面有多少行.(- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section)

2)每一行是个什么样的cell.(- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath)

//返回tableView有多少行
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{ return 10;
}
//给每一行设置一个cell
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
UITableViewCell *cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:nil]; cell.textLabel.text = @"张三";
cell.textLabel.textColor = [UIColor redColor];
cell.detailTextLabel.text = @"张三是张家人";
cell.imageView.image = [UIImage imageNamed:@"zhangsan.png"]; //右边出现小箭头
cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator; return cell; }

运行效果如下:

完整代码如下:

//
// ContactViewController.m
// UI-No8-UITableView
//
// Created by on 15/12/14.
// Copyright © 2015年 王立广. All rights reserved.
// #import "ContactViewController.h" @interface ContactViewController()<UITableViewDataSource,UITableViewDelegate>@end @implementation ContactViewController - (void)viewDidLoad{
[super viewDidLoad]; UITableView *tableView = [[UITableView alloc]initWithFrame:CGRectMake(, , , ) style:UITableViewStylePlain]; //给tableView设置表头
tableView.tableHeaderView = [self addHeaderView];
//给tableView设置表尾
tableView.tableFooterView = [self addFooterView]; tableView.delegate = self;
tableView.dataSource = self; tableView.backgroundColor = [UIColor grayColor]; [self.view addSubview:tableView]; } //设置表头
- (UIView *)addHeaderView{ UILabel *label = [[UILabel alloc]initWithFrame:CGRectMake(, , , )]; label.text = @"表头"; label.backgroundColor = [UIColor yellowColor]; return label;
} //设置表尾
- (UIView *)addFooterView{ UILabel *label = [[UILabel alloc]initWithFrame:CGRectMake(, , , )]; label.text = @"表尾"; label.backgroundColor = [UIColor yellowColor]; return label;
} //返回tableView有多少行
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{ return ;
} //tableView上将要显示一个cell时会调用这个方法,在方法内设置一个cell并返回便可将cell放到tableView上。
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{ UITableViewCell *cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:nil]; cell.textLabel.text = @"张三";
cell.textLabel.textColor = [UIColor redColor];
cell.detailTextLabel.text = @"张三是张家人";
cell.imageView.image = [UIImage imageNamed:@"zhangsan.png"]; //右边出现小箭头
cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator; return cell;
}
@end

性能优化

上面学习的东西,咱们已经能够将UItableView和UITableViewCell结合起来了,在上面的代码中有一个问题是每次出现一个新的cell,系统会创建一个新的cell对象。这样是十分浪费内存的,接下来咱们重写优化这个方法。

//tableView上将要显示一个cell时会调用这个方法,在方法内设置一个cell并返回便可将cell放到tableView上。
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
/*
* UITableView每次滑动,必定有消失的cell,系统会自动将这些消失的cell放到缓存池里,需要新cell时,系统先在缓存池里看是否有cell,有的话就利用,没有的话就新建。 * 前提:UITableView滑动
1、旧的cell消失,系统自动将这个cell放到缓存池里面。
2、新的cell要显示,就会代理方法。
1) 首先看缓存池里面有没有cell
2) 如果有cell就利用,如果没有就新建
3) 在代理方法中返回设置的cell
*/ static NSString *cellID = @"cellID"; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellID]; if (cell == nil) { cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:cellID];
} cell.textLabel.text = @"张三";
cell.textLabel.textColor = [UIColor redColor];
cell.detailTextLabel.text = @"张三是张家人";
cell.imageView.image = [UIImage imageNamed:@"zhangsan.png"]; //右边出现小箭头
cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator; return cell; }

tableView的其他代理方法

//设置每行的高
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{ return ;
}
//给tablView设置段数
/*
* tableView如果不实现这个代理方法,默认是一段,所以之前是给第一段设置行数,通过这个方法能够给tableView设置多段
*/
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{ return ;
}

PS:之前讲UITableView时说到有两种风格,现在切换到grouped模式运行看效果,现在看到分段效果即可,后面会慢慢的告诉你分段的用处。

总结:这次只是简单的讲了一些UITableView基本使用,和一些简单的代理方法。后面会继续深入带领大家学习。

UI-9-UITableView的更多相关文章

  1. iOS开发UI篇—UITableview控件简单介绍

    iOS开发UI篇—UITableview控件简单介绍 一.基本介绍 在众多移动应⽤用中,能看到各式各样的表格数据 . 在iOS中,要实现表格数据展示,最常用的做法就是使用UITableView,UIT ...

  2. iOS开发UI篇—UITableview控件基本使用

    iOS开发UI篇—UITableview控件基本使用 一.一个简单的英雄展示程序 NJHero.h文件代码(字典转模型) #import <Foundation/Foundation.h> ...

  3. iOS开发UI篇—UITableview控件使用小结

    iOS开发UI篇—UITableview控件使用小结 一.UITableview的使用步骤 UITableview的使用就只有简单的三个步骤: 1.告诉一共有多少组数据 方法:- (NSInteger ...

  4. UI:UITableView 编辑、cell重用机制

    tableView编辑.tableView移动.UITableViewController tableView的编辑:cell的添加.删除. 使⽤场景: 删除⼀个下载好的视频,删除联系⼈: 插⼊⼀条新 ...

  5. IOS开发UI基础UITableView的属性

    UITableView UITableView内置了两种样式:UITableViewStylePlain,UITableViewStyleGrouped <UITableViewDataSour ...

  6. UI基础:UITableView的编辑和移动

    相对UITableViiew进行编辑,必须设置代理,让代理遵循UITableViewDataSource和UITableViewDelegate协议.因为需要代理实现协议中几个必须的方法. UITab ...

  7. UI:UITableView表视图

    表视图 UITableView,iOS中最重要的视图,随处可⻅见. 表视图通常⽤用来管理⼀一组具有相同数据结构的数据. UITableView继承⾃自UIScrollView,所以可以滚动,表视图的每 ...

  8. UI之UItableView重用机制的性能问题

    *:first-child { margin-top: 0 !important; } body > *:last-child { margin-bottom: 0 !important; } ...

  9. Swift UI学习UITableView and protocol use

    Models: UserModel.swift Views: UserInfoCell.swift Controllers: RootViewController.swift, DetailViewC ...

  10. UI篇—UITableview

    一.基本介绍 在众多移动应⽤用中,能看到各式各样的表格数据 . 在iOS中,要实现表格数据展示,最常用的做法就是使用UITableView,UITableView继承自UIScrollView,因此支 ...

随机推荐

  1. 【匈牙利算法】BZOJ1059-[ZJOI2007]矩阵游戏

    [题目大意] 给出一个局部染色的矩阵,问能否通过交换行或者列使得最后又一条对角线全部被染色过? [思路] 无论如何交换,同一行的格子依然在同一行,同一列的格子依然在同一列.所以只需找出n个行号列号均不 ...

  2. 【棋盘DP】【OpenJudge7614】最低通行费

    最低通行费 总时间限制: 1000ms 内存限制: 65536kB [描述] 一个商人穿过一个 N*N 的正方形的网格,去参加一个非常重要的商务活动.他要从网格的左上角进,右下角出.每穿越中间1个小方 ...

  3. 【mybatis】mybatis 中update 更新操作,null字段不更新,有值才更新

    示例代码如下: <update id="updateGoodsConfigQuery" parameterType="com.pisen.cloud.luna.ms ...

  4. OpenGL.Vertex Array Object (VAO) [转]

    http://www.cppblog.com/init/archive/2012/02/21/166098.html 一 OpenGL抛弃glEnable(),glColor(),glVertex() ...

  5. 2017.11.15 hashmap的工作原理

    参考来自:http://blog.csdn.net/jeffleo/article/details/54946424 一 hashMap的基本概念 1.HashMap的定义 public class ...

  6. C# 代码生成器 (存储过程生成方法)

    最近研究C#,发现写代码很麻烦,特别是创建实体.模型.接口.工厂.存储过程之类,网上有些开源的,但是不完整,也不能完整的按需求生成,于是,花了三天的时候,结合前辈的一些经验,整合了一些代码生成器,以下 ...

  7. 使用IntelliJ IDEA创建Maven多模块项目

    转载:http://blog.csdn.net/xyw591238/article/details/52794788 使用Maven管理项目时,往往需要创建多个模块,模块之间存在相互引用的关系.对于M ...

  8. 说说css伪元素::before和::after,你就会明白我们为什么需要它

    wxml <view class='weui-loading'>#000</view> <view class='btn'><text class='gree ...

  9. 实现微信浏览器内打开App Store链接

    http://www.ildsea.com/1781.html 微信浏览器是不支持打开App Store 页面的,不知道微信为什么这么做.比如你页面写 <a href=”http://itune ...

  10. Django——20141014深入理解Django HttpRequest HttpResponse的类和实例

    深入理解Django HttpRequest HttpResponse的类和实例 了解META选项 了解中间件 理清所有模板传输模板变量的方式,并作出选择 Django模板系统:如何利用Django模 ...