UITableView是我們開發(fā)過程中最常用的UI之一,因此掌握UITableView的優(yōu)化方法,在我們開發(fā)的過程中能事半功倍。長話段數(shù),直接進入優(yōu)化的方法之中。
主要分為以下幾點:
1只定義一種Cell。
2提前計算并緩存每個Cell的高度。
3提前創(chuàng)建真正顯示的、需要加工的數(shù)據(jù)并緩存。
4緩存View!
其它(使用不透明的圖片,減少子視圖的添加,不要阻塞主線程,避免使用圖形特效)
1、只定義一種cell
? ? ? ? ? 對于需要展示大量數(shù)據(jù)的UI控件UITableView ,一般我們都會采用自定義的UITableviewcell的方式進行數(shù)據(jù)的展示。每個cell所展示的數(shù)據(jù)不一致,但是展示的樣式都大同小異。如下圖:

其cell的組成方式無非下圖各個子控件組成的。可以通過View的hidden = YES和hidden = NO來進行控制。

2、提前緩存cell的高度
首先要確定的是,在iOS中,系統(tǒng)會先調(diào)用“tableView:heightForRowAtIndexPath:”獲取每個Cell即將顯示的高度,從而確定整個UITableView的布局。然后才調(diào)用“tableView:cellForRowAtIndexPath”獲取每個Cell,我們也是在這里填充、設(shè)置Cell的。
所以,既然高度總會被用到,那就早早的在獲取數(shù)據(jù)時就計算好吧!
在Model(Entity)中計算并保存Cell的高度
其實,在Model(Entity)中保存UI的參數(shù)是很奇怪的=。=(最好放在ViewModel中,就是MVVM模式的),我們的Entity可能就是下面的樣子:
@interfaceDataEntity :NSObject//原始數(shù)據(jù)
@property(copy,nonatomic)NSString *content;
@property(copy,nonatomic)NSString *title;//Cell 高度
@property(assign,nonatomic)CGFloat cellHeight;
//計算高度
- (void)calculateCellHeight;@end
這樣,就不用在“tableView:heightForRowAtIndexPath:”中每次都計算了。
3、提前創(chuàng)建真正顯示的、需要加工的數(shù)據(jù)并緩存
Cell中顯示的內(nèi)容,很多時候可能并不是直接從服務(wù)器拿到的數(shù)據(jù),而是經(jīng)過“加工”的數(shù)據(jù)。如本文中的“動態(tài)”也,每個Cell的標(biāo)題、正文都有可點擊的連接Link、表情圖片等富文本內(nèi)容,而我們一般用NSAttributeString類來顯示。
既然每次都會用到,倒不如在獲取到數(shù)據(jù)的時候就創(chuàng)建、加工好這些內(nèi)容,等到需要現(xiàn)實的時候,直接拿來用不就行了。
所以,我們的Entity類可能變成下面這個樣子:
@interfaceDataEntity :NSObject
//原始數(shù)據(jù)
@property(copy,nonatomic)NSString *content;
@property(copy,nonatomic)NSString *title;
//Cell 高度
@property(assign,nonatomic)CGFloat cellHeight;
//真正顯示的內(nèi)容
@property(strong,nonatomic)NSAttributedString *showTitle;
@property(strong,nonatomic)NSAttributedString *showContent;
//計算高度
- (void)calculateCellHeight;
//創(chuàng)建、加工真正顯示的內(nèi)容
- (void)setupShowTitileAndContent;
@end
這樣,在“tableView:cellForRowAtIndexPath”中,我們直接拿showTitle、showContent來顯示就好,不用再創(chuàng)建。