关于UITableView你知道多少——UITableView简单解析

转自萧宸宇的博客  php

UITableView是在iOS开发中,展现大量内容的首选。我我的认为的缘由有如下几点:html

1.UITableView的展示形式是为移动设备专门设计过的。有较好的人机交互体验。ios

2.从技术角度来讲UITableView具备重用和延迟加载等特性。若是使用恰当。能够得到一个App流畅的用户体验。网络

 

这样,使得UITableView在iOS App中随处可见。app

 

原生应用异步

一些有名的App.图片信息较老函数

包括游戏性能

这些都说明UITableView在一个App中实际上是一个很经常使用的控件。我应该好好的学习它。学习

 

关于数据的思考 优化

没有UITableView的时候我是这样想的

首先思考为何会有UITableView这样的控件。咱们作一个App的时候,就会有大量的数据须要显示。好比weibo的每个状态。好比一个新闻App的不少条新闻。这些数据都会有一个特色就是他们的组织形式同样,只是内容变化。有时候咱们可能会根据一些条件进行分组。使得看来了是分组的。例如 联系人里面会按照首字母来进行分组同样。咱们还可能会点击数据以便查看更详细的内容。

 

经过上面的简单描述,若是来本身实现一个相似UITableView的结构。须要获得最核心的:

1.须要获得一共多少条数据

2.数据的具体内容是什么

 

若是咱们数据须要更加仔细的描述展现:

1.所有的数据一共有多少组

2.每一组有多少个数据

3.每一条数据的具体内容是什么

 

UITableView是怎么作的

在UITableView中。最重要的就是data source中的两个方法。

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

 

什么是data source。字面意思就是很明白,数据的来源。通常状况下咱们会设置拥有UITableView的这个UIViewController为他的data source。由于根据MVC来讲。

 

UITableView是View,UIViewController是Controller。View须要的数据,应该是Controller去跟Model协调而后得到,之后由Controller去给View来进行显示。View永远的不去直接跟Model联系。这样当UITableView初始化的时候。他就会去问他的data source。我须要显示多少行数据啊。每一行的数据都是什么内容啊。这时候UIViewController应该已经从Model拿到了数据。而后经过- (NSInteger)tableView:(UITableView )tableView numberOfRowsInSection:(NSInteger)section;告诉UITableview,恩你的这一组要显示n条数据。又用- (UITableViewCell )tableView:(UITableView )tableView cellForRowAtIndexPath:(NSIndexPath )indexPath函数告诉UITableView说,第几组第几条数据的具体内容是什么。

 

UITableView还有一个比较犀利的地方就是若是你的数据有10000条。它确定不是把10000条都加载进来。而是只加载须要显示的条目数据。这样设计,使得UITableView的流畅程度大大提升。值得注意的是,若是Cell里面的数据是从网络 or Core Data等其余地方读取的。咱们应该把读取动做写成异步的。不阻塞主线程。取到数据之后在回答主线程去刷新UI。

 

UITableView从建立到显示的调用顺序以下图

(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView这个函数是最早调用,可是它默认返回1.因此并非必须的。若是你的UITableView分了好几组,这个就是用来返回组的数量的。

这样完成了设置UITableView的data source设置。再完成

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

 

这两个函数。咱们就能够获得一个能显示的UITableView了。

 

如今是是仅仅解释了UITableView的数据是怎么来的,而后怎么对应到UITableView上面。

 

UITableViewCell

UITableViewCell具体的每一条数据展现的具体View。首先在UITableView里面有这样一个特色,每个Cell的大概样子都长的差很少,只是里面具体的内容稍有变化。这样在UI里面咱们应该是重用相同的部分,改变不一样的部分。这样才能提升效率。由于在UiTableView这个视图里面,用户习惯性快速的滚动,视图和数据内容都会快速的变化,若是效率问题处理很差,很容易有卡顿的现象。形成用户体验的下降。

 

若是使用默认的UITableViewCell风格,有如下四种:

UITableViewCellStyleDefault

UITableViewCellStyleSubtile

UITableViewCellStyleValue1

UITableViewCellStyleValue2

固然若是是须要自定义Cell也是很简单。 用xib拖一个,彻底能够GUI的方式来建立,非常方便。

 

(Google一个栗子吧,写不动了)插一句,Cell的重用是须要下面这样的实现方法

  - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath  {      static NSString *Cell = @"MyCell";      UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:Cell];      if (!cell) {          cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:Cell];      }      return cell;  }

重要的是UITableView的dequeueReusableCellWithIdentifier方法。

 

dequeueReusableCellWithIdentifier去一个队列里面需找有没有相同ID的的Cell。若是有就提出来重用。能够重用的部分。若是没有就跳进if里面去建立。因此咱们在if里面建立的时候,不会改变的内容均可以在里面建立,这样就只用建立一次。须要改变的内容咱们就放到if后面去写。 这样咱们就能完成高效的UITableView。固然,理论上来讲,你能够不用这样的机制,而去直接每次建立一个Cell。不过这是很是浪费资源的一个作法,直接不提倡。

 

UITableView Delegate

固然,在写UITableView确定想控制的更多。才能完成设计师们辛辛苦苦画出来的稿。这样咱们能够去看看Data source里面剩下的函数和Delegate。固然就说一点

 

  //选中Cell响应事件  - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath  {      //选中后的反显颜色即刻消失      [tableView deselectRowAtIndexPath:indexPath animated:YES];  }

 

这个是选中Cell时候会的出发点。若是要点击之后作什么事情 就在这里作了。

 

找了篇目测还ok的  中文blog能够先看看了解 

 

数据刷新

若是咱们的modle更新了。相应的要体现到UITableView上面。简单的咱们能够reload整个TableView。这样作很方便,并且数据上没有问题。惟一的问题就是,reload整个TableView的效率过低了。并且,每每咱们只是少数的Cell内容变化。因此没有必要去reload整个TableView。而是那条数据变化去刷新对应的Cell就行了。这样作效率提升不少。

 

具体涉及到的几个函数

  - (void)beginUpdates;  - (void)endUpdates;     - (void)insertSections:(NSIndexSet *)sections withRowAnimation:(UITableViewRowAnimation)animation;  - (void)deleteSections:(NSIndexSet *)sections withRowAnimation:(UITableViewRowAnimation)animation;  - (void)reloadSections:(NSIndexSet *)sections withRowAnimation:(UITableViewRowAnimation)animation;     - (void)insertRowsAtIndexPaths:(NSArray *)indexPaths withRowAnimation: (UITableViewRowAnimation)animation;  - (void)deleteRowsAtIndexPaths:(NSArray *)indexPaths withRowAnimation: (UITableViewRowAnimation)animation;  - (void)reloadRowsAtIndexPaths:(NSArray *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation;

这里有实例代码能够参考

 

苹果官方教程

 

里面写了如何优化UITableView:

 

又找了一篇blog写的很不错的样子,  优化UITableView性能

 

后记

总结就是UITableView是一个高度设计的控件。它具备重用,分组,异步加载数据等方面须要咱们注意。

 

其实这里插进来写UITableView是为了写NSFetchedResultsController。由于NSFetchedResultsController就是为UITableview量身打造的Core Data的类。

 

因此,先说明如下UITableView,而后再写NSFetchedResultsController。

相关文章
相关标签/搜索