iOS開發之UI學習-UITableView的複用機制

 

iOS開發之UI學習-UITableView的複用機制

標籤: iosUI控件UITableView單元格複用重用
 分類:

    最近編寫新功能的時候,偶然間發現有較少開發經驗的開發人員對於表視圖的單元格的複用問題並非瞭解的很透徹,因此在此經過代碼的形式快速的教給你們如何理解和運用單元格的複用問題。表視圖是在開發中常常使用的控件,並且有時處理的內容量也是很是巨大的,這就須要考慮表視圖的性能優化,而最基本的性能優化則是單元格的複用,正所謂基礎打得好,才能飛得高,因此須要很好的理解單元格是如何複用的。xcode

 

    在表視圖顯示的時候,會建立 (視圖中可看的單元格個數+1)個單元格,一旦單元格由於滑動的而消失在咱們的視野中的時候,消失的單元格就會進入緩存池(或叫複用池),當有新的單元格須要顯示的時候,會先從緩存池中取可用的單元格,獲取成功則使用獲取到的單元格,獲取失敗則從新建立心的單元格,這就是整個的複用機制。可是如何進行復用,這裏有兩種方式:緩存

 

第一種方式:性能優化

本身手動建立新的單元格ide

 

[objc]  view plain  copy
 
  1. #import "ViewController.h"  
  2.   
  3. #define width  [UIScreen mainScreen].bounds.size.width  
  4. #define height [UIScreen mainScreen].bounds.size.height  
  5.   
  6. static NSString *identifying = @"標識";  
  7.   
  8. @interface ViewController ()<UITableViewDelegate, UITableViewDataSource>  
  9.   
  10. @property (nonatomic, strong) UITableView *tableView;  
  11.   
  12. @end  
  13.   
  14. @implementation ViewController  
  15.   
  16. - (void)viewDidLoad {  
  17.     [super viewDidLoad];  
  18.       
  19.     //建立表視圖  
  20.     /* 
  21.      UITableViewStylePlain     平鋪類型 
  22.      UITableViewStyleGrouped   分組類型 
  23.      */  
  24.     _tableView = [[UITableView alloc] initWithFrame:CGRectMake(0, 0, width, height) style:UITableViewStylePlain];  
  25.     //讓當前控制器成爲表視圖的代理  
  26.     _tableView.delegate = self;  
  27.     _tableView.dataSource = self;  
  28.     [self.view addSubview:_tableView];  
  29. }  
  30.   
  31. #pragma mark - UITableViewDelegate 代理方法  
  32. //設置cell的行高  
  33. - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{  
  34.       
  35.     return 100;  
  36. }  
  37.   
  38. #pragma mark - UITableViewDataSource 數據源  
  39. //設置cell的個數  
  40. - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{  
  41.       
  42.     return 20;  
  43. }  
  44.   
  45. //設置cell  
  46. - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{  
  47.       
  48.     //1.根據標識去緩存池中去取cell  
  49.     UITableViewCell *cell = [_tableView dequeueReusableCellWithIdentifier:identifying];  
  50.       
  51.     //2.根據是否取到了可用的cell來判斷是否須要從新建立cell(手動建立新的單元格)  
  52.     if (cell == nil){  
  53.           
  54.         cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifying];  
  55.     }  
  56.     //3.設置單元格的顯示數據  
  57.     cell.textLabel.text = [NSString stringWithFormat:@"第%ld行",indexPath.row];  
  58.       
  59.     //經過打印cell的地址,咱們來查看是否複用了cell  
  60.     NSLog(@"address --- %p ----- 第%ld行",cell, indexPath.row);  
  61.       
  62.     return cell;  
  63. }  
  64.   
  65. @end  

經過打印的地址咱們能夠看出複用:

 

 

 

 

 

第二種方式:post

經過註冊單元格類的方式,由表視圖本身建立單元格性能

 

[objc]  view plain  copy
 
  1. #import "ViewController.h"  
  2.   
  3. #define width  [UIScreen mainScreen].bounds.size.width  
  4. #define height [UIScreen mainScreen].bounds.size.height  
  5.   
  6. static NSString *identifying = @"標識";  
  7.   
  8. @interface ViewController ()<UITableViewDelegate, UITableViewDataSource>  
  9.   
  10. @property (nonatomic, strong) UITableView *tableView;  
  11.   
  12. @end  
  13.   
  14. @implementation ViewController  
  15.   
  16. - (void)viewDidLoad {  
  17.     [super viewDidLoad];  
  18.       
  19.     //建立表視圖  
  20.     /* 
  21.      UITableViewStylePlain     平鋪類型 
  22.      UITableViewStyleGrouped   分組類型 
  23.      */  
  24.     _tableView = [[UITableView alloc] initWithFrame:CGRectMake(0, 0, width, height) style:UITableViewStylePlain];  
  25.     //讓當前控制器成爲表視圖的代理  
  26.     _tableView.delegate = self;  
  27.     _tableView.dataSource = self;  
  28.     [self.view addSubview:_tableView];  
  29.       
  30.     //註冊單元格的類型  
  31.     [_tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:identifying];  
  32. }  
  33.   
  34. #pragma mark - UITableViewDelegate 代理方法  
  35. //設置cell的行高  
  36. - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{  
  37.   
  38.     return 100;  
  39. }  
  40.   
  41. #pragma mark - UITableViewDataSource 數據源  
  42. //設置cell的個數  
  43. - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{  
  44.   
  45.     return 20;  
  46. }  
  47.   
  48. //設置cell  
  49. - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{  
  50.   
  51.     //1.根據標識去緩存池中去取cell  
  52.     UITableViewCell *cell = [_tableView dequeueReusableCellWithIdentifier:identifying];  
  53.   
  54.     //2.假若根據ID標識來判斷有沒有對應的cell類型,當緩存池中沒有能夠複用的cell的時候,會根據註冊的類型自動建立cell  
  55.       
  56.     //3.設置單元格的顯示數據  
  57.     cell.textLabel.text = [NSString stringWithFormat:@"第%ld行",indexPath.row];  
  58.       
  59.     //經過打印cell的地址,咱們來查看是否複用了cell  
  60.     NSLog(@"address --- %p ----- 第%ld行",cell, indexPath.row);  
  61.       
  62.     return cell;  
  63. }  
  64.   
  65. @end  

經過打印的地址咱們能夠看出複用:

 

 

兩種單元格的複用的方式存在着細微的差異,新手通常狀況下會不太理解,可是隻要仔細觀看以上的代碼,或者將代碼直接粘貼到新建立的工程中去,而後運行,能夠得出和我截圖出的同樣的結果。但願以上代碼可以幫助對於表視圖的單元格複用不太理解的開發人羣。固然這裏只是簡單的講解了一下單元格的重用機制,在實際的開發過程當中,可能會由於不一樣的展現效果,須要合理的利用單元格的複用。學習

相關文章
相關標籤/搜索