iOS基础 - UITableViewController
1. 继承UITableViewController默认会设置数据源和代理,并且会自动遵守数据源和代理协议,并且self.tableView 相当于 self.view
2.更换控制器时,注意把storyboard中之前的控制器给删了,然后在重新拖一个进来,并且设置他的class为新的控制器。就能在加载程序的时候,进入新的控制器。
3.自定义cell例子思路引导
步骤一:创建xib,描述自定义cell的外观。(UIImageView,3个UILabel)
步骤二:取消Autolayout
步骤三:实现数据源方法
- 定义可重用标识
- 从缓冲池里取cell
- 判断cell是否为空,如果为空,就手动创建
- 设置cell的内容
步骤四:通过代理方法,设置cell的高度。
补充:如果所有行一样,用rowHeigth属性设置高度,不一样用代理设置高度。
步骤五:设置xib中重用标识符。
步骤六:创建模型对象News(title,icon,comments,author)
步骤七:解析pilst文件转成模型数据
步骤八:创建自定义cell类,并且属性与xib连线。(不要依赖控制器)
步骤九:自定义cell提供一个类方法接口给外界。
步骤十:在外界直接使用自定义cell。
4.自定义视图的步骤
1.创建xib,描述自定义视图。
2.xib的名称最好跟自定义视图名称相似。
3.创建自定义视图类,类名和xib名字相同
4.将自定义视图和xib关联,告诉xib描述哪个自定义视图。即更改xib里的class为自定义类
5.绑定之后,然后让自定义视图类的属性和xib中的控件连线。
6.连线成功,点击小实点,能看下xib上的控件外部有框框就OK了。
7.在自定义视图类中给外界提供类方法接口,用来返回一个自定义视图类,方法名以自己类名开头。
8.实现自定义视图类方法
9.自定义视图创建成功,在外界直接导入头文件就能使了。
10.运行效果
5. 属性的名称和方法名称不要以new开头
6. 自定义视图是UITableViewCell,描述它的xib一定要设置重用标识。
7. 封装cell的步骤
1. 新建xib描述cell的样子---DealCell.xib
2.新建UITableViewCell的子类---DealCell(封装xib内部的所有东西)
注意xib名称要和类名名称一样
3. 修改xib中cell的类名(class)为DealCell
4.在DealCell中拥有xib中的所有子控件(声明属性、进行连线)
5.新建模型Deal,封装数据,名字也要取得有意义。
6. 给DealCell增加模型属性
@property (nonatomic, strong) Deal *deal;
7. 重写setDeal:方法,在这个方法中根据模型数据设置cell内部子控件的属性
8.提供一个类方法,返回从xib中创建好的cell对象
+ (id)dealCell;
+ (id)dealCell
{
return [[NSBundle mainBundle] loadNibNamed:@"DealCell" owner:nil options:nil][0];
}
9.给xib中的cell添加一个重用标识(比如deal),提供一个类方法,返回重用标识
10.提供一个类方法,返回cell的高度
+ (CGFloat)cellHeight;
+ (CGFloat)cellHeight
{
return 80;
}
11.在控制器中导入自定义cell的头文件就能使用了。
8. 设置每一行高度
每一行cell高度一样,使用这个方法
每一行,高度不一样,使用代理方法
9. 微博小例子思路(用代码自定义cell)
思路:项目中cell中内部控件高度不一样,最好用代码创建自定义cell。
步骤一:创建自定义cell。
步骤二:在下面方法中描述cell。
- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
- 添加内部的子控件到contentView上面(先不管位置和内容)
- 创建微博模型
- 给微博模型提供一个类方法,将字典转换为模型。
- 给自定义cell添加微博模型,重写set方法,设置cell子控件的数据和位置
- 设置数据
- 设置位置
位置计算注意:计算文字高度时,如果UILabel不需要换行,根据字体算出尺寸,使用以下方法。
- (CGSize)sizeWithFont:(UIFont *)font;
如果UILabel需要换行,使用使用以下方法.
5.由于返回每一行高度比返回每一行cell内容先调用。因此获取每一行的高度,不能直接从cell对象中获取,因为那时候还没创建cell对象,因此我们需要另外创建一个模型,用来管理cell内部所有子控件的frame和cell的总高度。
6.在viewDidLoad方法中,就将cellFrame模型用数组保存起来.
7.实现数据源方法。
10. 注册一个xib文件
如果tableView通过identifier这个标志去缓冲池中没有取到可循环利用的cell,就会加载xib文件来创建。
- (void)registerNib:(UINib *)nib forCellReuseIdentifier:(NSString *)identifier
11. 注册自定义单元格
如果tableView通过identifier这个标志去缓冲池中没有取到可循环利用的cell,就会加载cellClass类来创建。
-(void)registerClass:(Class)cellClass forCellReuseIdentifier:(NSString *)identifier
12.UITableViewCell里只有一个子控件contentView,即使xib中将子控件拖入cell中,但是是假象,实际上苹果帮我们已经将子控件添加到contentView.
一、加载xib文件的两种方式 1.方法一(NewsCell是xib文件的名称) NSArray *objects = [[NSBundle mainBundle] loadNibNamed:@"NewsCell" owner:nil options:nil];
2.方法二 UINib *nib = [UINib nibWithNibName:@"NewsCell" bundle:nil]; NSArray *objects = [nib instantiateWithOwner:nil options:nil];
二、设置cell的高度 1.如果每一行cell的高度都是一样的,直接使用tableView的rowHeight属性设置cell的高度即可 tableView.rowHeight = 80;
2.如果每一行cell的高度不一定一样,应该用代理方法设置cell的高度 - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { // 返回indexPath这行对应cell的高度 return 80; }
三、UITableViewController 1.UITableViewController内部默认会创建一个UITableView *tableView 2.UITableViewController内部tableView的delegate(代理)和dataSource(数据源)就是这个UITableViewController 3.UITableViewController内部tableView就是控制器的view
四、自定义cell 1.通过xib 1> 一定要注意在xib的cell中设置重用标识(reuse identifier)
2> 封装的步骤 * 新建xib描述cell的样子---DealCell.xib * 新建UITableViewCell的子类---DealCell(封装xib内部的所有东西) * 修改xib中cell的类名(class)为DealCell * 在DealCell中拥有xib中的所有子控件(声明属性、进行连线) * 新建模型Deal,封装数据 * 给DealCell增加模型属性 @property (nonatomic, strong) Deal *deal; * 重写setDeal:方法,在这个方法中根据模型数据设置cell内部子控件的属性 * 提供一个类方法,返回从xib中创建好的cell对象 * 给xib中的cell添加一个重用标识(比如deal),提供一个类方法,返回重用标识 * 提供一个类方法,返回cell的高度
3> 使用cell * 设置每一行cell的高度 * 利用重用标识去缓存池取得cell * 如果缓存池没有cell,创建cell * 传递模型给cell
2.通过代码 1> 新建一个UITableViewCell的子类---WeiboCell
2> 在创建cell的时候(initWithStyle:reuseIdentifier:方法中)添加cell内部需要使用的子控件 (注意:只管创建添加子控件,先不要去管子控件的位置和尺寸)
3> 新建一个模型类---Weibo,增加对应的数据属性
4> 给WeiboCell增加一个Weibo模型属性,在拿到Weibo模型数据的同时设置子控件的属性
5> 重写setWeibo:方法,在这里面取出Weibo模型的数据显示到子控件上
五、UITableView方法补充 1.如果tableView通过@"Cell"这个标志去缓存池中没有取到可循环利用的Cell,就会加载MyCell1.xib文件来创建cell [self.tableView registerNib:[UINib nibWithNibName:@"MyCell1" bundle:nil] forCellReuseIdentifier:@"Cell"];
2.如果tableView通过@"cell2"这个标志去缓存池中没有取到可循环利用的Cell,就会创建MyCell2对象作为cell [self.tableView registerClass:[MyCell2 class] forCellReuseIdentifier:@"cell2"];
iOS基础 - UITableViewController的更多相关文章
- IOS基础学习-2: UIButton
IOS基础学习-2: UIButton UIButton是一个标准的UIControl控件,UIKit提供了一组控件:UISwitch开关.UIButton按钮.UISegmentedContro ...
- iOS 基础日记-修饰符
今晚随便温习了一下iOS 基础关于修饰符这块的东西,下面简单的来描述一下,其中有的也是在网络学习到的: strong与weak是由ARC新引入的对象变量属性 ARC的解释:ARC引入了新的对象的生命周 ...
- iOS基础问答面试
<简书社区 — Timhbw>iOS基础问答面试题连载(一)-附答案:http://www.jianshu.com/p/1ebf7333808d <简书社区 — Timhbw> ...
- [iOS基础控件 - 5.5] 代理设计模式 (基于”APP列表"练习)
A.概述 在"[iOS基础控件 - 4.4] APP列表 进一步封装,初见MVC模式”上进一步改进,给“下载”按钮加上效果.功能 1.按钮点击后,显示为“已下载”,并且不 ...
- [置顶] IOS 基础入门教程
IOS 基础入门教程 教程列表: IOS 简介 IOS环境搭建 Objective C 基础知识 创建第一款iPhone应用程序 IOS操作(action)和输出口(Outlet) iOS - 委托( ...
- iOS 基础:Frames、Bounds 和 CGGeometry
https://segmentfault.com/a/1190000004695617 原文:<iOS Fundamentals: Frames, Bounds, and CGGeometry& ...
- iOS 基础入门--Bull' Eye 小游戏
说明 Bull's Eye小游戏是http://www.raywenderlich.com/store/ios-apprentice里非常酷的入门demo 跟着该教程一步步做下来便有了 ...
- iOS 基础函数解析 - Foundation Functions Reference
iOS 基础函数解析 - Foundation Functions Reference 太阳火神的漂亮人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名- ...
- iOS UITableViewCell UITableVIewController 纯代码开发
iOS UITableViewCell UITableVIewController 纯代码开发 <原创> .纯代码 自定义UITableViewCell 直接上代码 ////// #imp ...
随机推荐
- activiti入门2流程引擎API和服务基础设施
RepositoryService : 管理和控制公布包和流程定义(包括了一个流程每一个环节的结构和行为)的操作 除此之外,服务能够 查询引擎中的公布包和流程定义. 暂停或激活公布包.相应所有和特定流 ...
- 2.cocos2dx 3.2在语法的差异,lambada使用表达式和function和bind使用功能
1 打开 - 内置T32 Cocos2dx-3.2一个专案 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdG90b3R1enVvcXVhb ...
- 跳水Hibernate(一)实例解说
此语一与高二接触SSH三框架,但是,当能力有限.我们没有继续下行.今天,我们正在采取的优势Java金痴迷,随即再次上调,另一项研究SSH.让我们先从SSH中间Hibernate说起. 或许你会问.为什 ...
- mysql 的load data infile要使用
LOAD DATA INFILE从文本文件中读出的声明以极高的速度到表. 1.基本语法 LOAD DATA [LOW_PRIORITY | CONCURRENT] [LOCAL] INFILE 'fi ...
- 如何利用百度音乐播放器的API接口来获取高音质歌曲
第一步:在网页中打开以下网址: http://box.zhangmen.baidu.com/x?op=12&count=1&title=时间都去哪儿了$$王铮亮$$$$ 其中红色地方可 ...
- 华为机试 之 joseph环
一:首先科普一下约瑟夫问题的数学方法 (1) 不管是用list实现还是用vector实现都有一个共同点:要模拟整个游戏过程,不仅程序写起来比較烦,并且时间复杂度高达O(nm),当n,m很大(比如上百 ...
- Git@OSC & SSH配置
#### [ 导入外部Git仓库到中国源代码托管平台(Git@OSC)] 免费代码托管 您可以通过SSH或者HTTP的方式提交和管理代码,也可以通过Web的方式在线阅读,编辑代码与Team@OSC的集 ...
- String 的intern() 方法说明
1.说明 Java中string.intern()方法调用会先去字符串常量池中查找相应的字符串,如果字符串不存在,就会在字符串常量池中创建该字符串然后再返回. 2.源码说明 public native ...
- solrnet的使用
solr与.net系列课程(五)solrnet的使用 solr与.net系列课程(五)solrnet的使用 最近因项目比较忙,所以这篇文章出的比较晚,离上一篇文章已经有半个月的时间了,这节课我们 ...
- 清空SQL Server数据库中所有表数据的方法
原文:清空SQL Server数据库中所有表数据的方法 其实删除数据库中数据的方法并不复杂,为什么我还要多此一举呢,一是我这里介绍的是删除数据库的所有数据,因为数据之间可能形成相互约束关系,删除操作可 ...