UITableView

UITableView



//轉載請註明出處--本文永久連接:http://www.cnblogs.com/ChenYilong/p/3496969.htmlhtml

本文對應pdf文檔下載連接,猛戳->:UITableView.pdf
1.6 MB
web

(https://www.evernote.com/shard/s227/sh/fbffb63f-55ba-441f-945e-5ba511812d0d/a0e328ca59db246f3926b92f52bf6d38)緩存

 

UITableViewapp

技術博客http://www.cnblogs.com/ChenYilong/   新浪微博http://weibo.com/luohanchenyilong

基本控件文檔 - 的UITableView


 
 


l   iOS 中顯示數據列表最經常使用的一個控件,支持垂直滾動

   


UITableView 的兩種內置樣式
UITableViewStylePlain UITableViewStyleGrouped

 

數據源 (dataSource) 和代理 (delegate)
l  UITableView 須要一個數據源 (dataSource) 來顯示數據 , UITableView 會向數據源查詢一共有多少行數據以及每一行顯 示什麼數據等。沒有設置數據源的 UITableView 只是個空殼。凡 是遵照 UITableViewDataSource 協議的 OC 對象,均可以 是 UITableView 的數據源
l   一般都要爲 UITableView 設置代理對象 (delegate), 以便 在 UITableView 觸發一下事件時作出相應的處理,好比選中了某 一行。凡是遵照了 UITableViewDelegate 協議的 OC 對象,均可 以是 UITableView 的代理對象 
l   通常會讓控制器充當 UITableView dataSource delegate 



//轉載請註明出處--本文永久連接:http://www.cnblogs.com/ChenYilong/p/3496969.htmlide




UITableViewDataSource

l  @required
u  -(NSInteger) tableView :(UITableView*)tableView
numberOfRowsInSection :(NSInteger)section;
section 分區一共有多少行
u  -(UITableViewCell*) tableView :(UITableView*)tableView cellForRowAtIndexPath :(NSIndexPath *)indexPath;
建立第 section 分區第 row 行的 UITableViewCell 對象 (indexPath 包含 了 section row)
l  @optional
u  -(NSInteger) numberOfSectionsInTableView :(UITableView
*)tableView;  一共有多少個分區
u  -(NSString*) tableView :(UITableView*)tableView
titleForHeaderInSection :(NSInteger)section; section 分區的頭部標題

UITableViewDataSource
u  -(NSString*) tableView :(UITableView*)tableView titleForFooterInSection :(NSInteger)section;
section 分區的底部標題
u  -(BOOL) tableView :(UITableView*)tableView
canEditRowAtIndexPath :(NSIndexPath *)indexPath;
某一行是否能夠編輯 ( 刪除 )
u  -(BOOL) tableView :(UITableView*)tableView canMoveRowAtIndexPath :(NSIndexPath *)indexPath;
某一行是否能夠移動來進行從新排序
u  -(NSArray*) sectionIndexTitlesForTableView :(UITableView *)tableView;
UITableView 右邊的索引欄的內容

UITableViewDelegate
l  - (void) tableView :(UITableView *)tableView  didSelectRowAtIndexPath :(NSIndexPath *)indexPath
選中了 UITableView 的某一行
l  - (CGFloat) tableView :(UITableView *)tableView
heightForRowAtIndexPath :(NSIndexPath *)indexPath  某一行的高度
l  - (CGFloat) tableView :(UITableView *)tableView  heightForHeaderInSection :(NSInteger)section
section 分區頭部的高度
l  - (CGFloat) tableView :(UITableView *)tableView
heightForFooterInSection :(NSInteger)section section 分區尾部的高度

UITableViewDelegate
l  - (UIView *) tableView :(UITableView *)tableView  viewForHeaderInSection :(NSInteger)section
section 分區頭部顯示的視圖
l  - (UIView *) tableView :(UITableView *)tableView
viewForFooterInSection :(NSInteger)section
section 分區尾部顯示的視圖
l  - (NSInteger) tableView :(UITableView *)tableView  indentationLevelForRowAtIndexPath :(NSIndexPath *)indexPath
設置每一行的等級縮進 ( 數字越小,等級越高 )

UITableViewCell
l   UITableView 的每一行都是一個 UITableViewCell, 經過 dataSource  tableView : cellForRowAtIndexPath : 方法來初始化每一行 
l   UITableViewCell UIView 的子類,內部有個默認的子視圖 : contentView  contentView UITableViewCell 所顯示內容的父視圖,並負責顯示一些 輔助指示視圖。輔助指示視圖的做用是顯示一個表示動做的圖標,能夠經過設 置 UITableViewCell accessoryType 來顯示,默認 是 UITableViewCellAccessoryNone( 不顯示輔助指示視圖 ) ,其餘值以下 : 
u UITableViewCellAccessoryDisclosureIndicator  
u UITableViewCellAccessoryDetailDisclosureButton
u   UITableViewCellAccessoryCheckmark 

//轉載請註明出處--本文永久連接:http://www.cnblogs.com/ChenYilong/p/3496969.html佈局



UITableViewCell contentView
l  contentView 下默認有 3 個子視圖,其中的 2 個是 UILabel( 通 過 UITableViewCell textLabel detailTextLabel 屬性訪問 ) ,第 3  個是 UIImageView( 經過 UITableViewCell imageView 屬性訪問 )
l  UITableViewCell 還有一個 UITableViewCellStyle 屬性,用於決定使 用 contentView 的哪些子視圖,以及這些子視圖在 contentView 中的位置
UITableViewCellStyleDefault
UITableViewCellStyleSubtitle
UITableViewCellStyleValue1
UITableViewCellStyleValue2



UITableViewCell 對象的重用原理
l  iOS 設備的內存有限,若是用 UITableView 顯示成千上萬條數據,就需 要成千上萬個 UITableViewCell 對象的話,那將會耗盡 iOS 設備的 內存。要解決該問題,須要重用 UITableViewCell 對象
l  重用原理 :當滾動列表時,部分 UITableViewCell 會移出窗口 , UITableView 會將窗口外的 UITableViewCell 放入一個對象池中 ,等待重用。當 UITableView 要求 dataSource 返 回 UITableViewCell 時, dataSource 會先查看這個對象池,若是池 中有未使用的 UITableViewCell , dataSource 會用新的數據配置這 個 UITableViewCell ,而後返回給 UITableView ,從新顯示到窗 口中,從而避免建立新對象

UITableViewCell 對象的重用原理
l   還有一個很是重要的問題:有時候須要自定義 UITableViewCell( 用一個子類 繼承 UITableViewCell) ,並且每一行用的不必定是同一 種 UITableViewCell( 如短信聊天佈局 ) ,因此一個 UITableView 可能擁有不 同類型的 UITableViewCell ,對象池中也會有不少不一樣類型 的 UITableViewCell ,那麼 UITableView 在重用 UITableViewCell 時可能 會獲得錯誤類型的 UITableViewCell 
l   解決方案 : UITableViewCell 有個 NSString * reuseIdentifier 屬性,可 以在初始化 UITableViewCell 的時候傳入一個特定的字符串標識來設 置 reuseIdentifier( 通常用 UITableViewCell 的類名 ) 。當 UITableView  要求 dataSource 返回 UITableViewCell 時,先經過一個字符串標識到對象池 中查找對應類型的 UITableViewCell 對象,若是有,就重用,若是沒有,就傳 入這個字符串標識來初始化一個 UITableViewCell 對象
一個 UITableView 中不一樣類型的 UITableViewCell
 

重用 UITableViewCell 對象
- (UITableViewCell *) tableView :(UITableView *)tableView
cellForRowAtIndexPath :(NSIndexPath *)indexPath {
static NSString *identifier = @"UITableViewCell";
UITableViewCell *cell = [tableView
dequeueReusableCellWithIdentifier :identifier];
if (cell == nil) {
cell = [[[UITableViewCell alloc]
initWithStyle :UITableViewCellStyleDefault reuseIdentifier :identifier] autorelease];
}
cell.textLabel.text = [NSString stringWithFormat:@"Text %i",
indexPath.row];
     return cell;
}

//轉載請註明出處--本文永久連接:http://www.cnblogs.com/ChenYilong/p/3496969.htmlpost


UITableViewCell 的經常使用屬性
l  設置背景
u  backgroundView
l  設置被選中時的背景視圖
u  selectedBackgroundView
l  selectionStyle 屬性可設置 UITableViewCell 被選中時的 背景顏色 :  u UITableViewCellSelectionStyleNone  沒有顏色
u  UITableViewCellSelectionStyleBlue  藍色(默認)
u  UITableViewCellSelectionStyleGray  灰色

自定義 UITableViewCell

l  通常有兩種方式 :
1  用一個 xib 文件來 UITableViewCell 的內容 在這設置字符串標識,以便重用
2  經過代碼往 UITableViewCell contentView 中添加子視圖,在 初始化方法 ( 好比 init initWithStyle:reuseIdentifier: )  中添加子控件,在 layoutSubviews 方法中分配子控件的位置和大小

UITableView 的編輯模式
l  UITableView 有個 editing 屬性,設置爲 YES 時,能夠進入編輯模式。在編 輯模式下,能夠管理表格中的行,好比改變行的排列順序、增長行、刪除行 ,但不能修改行的內容
l  多種方式開啓編輯模式
u @property(nonatomic,getter=isEditing)BOOLediting
u  -(void)setEditing:(BOOL)editinganimated:(BOOL)animated

刪除 UITableView 的行
l  首先要開啓編輯模式
l  實現 UITableViewDataSource 的以下方法:
- (void) tableView :(UITableView *)tableView commitEditingStyle  :(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath  :(NSIndexPath *)indexPath {
//  若是 UITableView 交的是刪除指令
if (editingStyle == UITableViewCellEditingStyleDelete) {
//  刪除真實數據
// [self.data removeObjectAtIndex:indexPath.row];
//  刪除 UITableView 中的某一行 ( 帶動畫效果 )
      [tableView deleteRowsAtIndexPaths:[NSArray
     arrayWithObject:indexPath]
     withRowAnimation:UITableViewRowAnimationLeft];
//  若是不考慮動畫效果,也能夠直接 [tableView reload];  }

}
移動 UITableView 的行
l  首先要開啓編輯模式
l  實現 UITableViewDataSource 的以下方法 ( 若是沒有實現此方法,將沒法換行 )
- (void) tableView :(UITableView *)tableView moveRowAtIndexPath  :(NSIndexPath *)sourceIndexPath  toIndexPath :(NSIndexPath
*)destinationIndexPath {
int from = sourceIndexPath.row; int to = destinationIndexPath.row; if (from == to) return;
//  交換數據
// [self.data exchangeObjectAtIndex:from
withObjectAtIndex:to];
}

選中 UITableView 的行
l  當某行被選中時會調用此方法 (UITableViewDelegate 的方法 )
- (void) tableView :(UITableView *)tableView didSelectRowAtIndexPath :(NSIndexPath *)indexPath {
// 取消選中某一行 , 讓被選中行的高亮顏色消失 ( 帶動畫效果 )  [tableView deselectRowAtIndexPath:indexPath
animated:YES];
}



 
UITableView 經常使用方法
l  - (id) initWithFrame :(CGRect)frame  style :(UITableViewStyle)style  初始化一個 UITableView ,而且設置表格樣式
l   - (void) reloadData  從新訪問數據源,刷新界面 
l   - (NSInteger) numberOfSections  分區的個數 
l   - (NSInteger) numberOfRowsInSection :(NSInteger)section 
section 分區的行數 
l  - (UITableViewCell *) cellForRowAtIndexPath :(NSIndexPath *)indexPath
經過 indexPath 找到對應的 UITableViewCell 對象
l  - (void) setEditing :(BOOL)editing  animated :(BOOL)animated
是否要開啓編輯模式
l  - (void) deselectRowAtIndexPath :(NSIndexPath *)indexPath  animated  :(BOOL)animated
取消選中某一行 , 讓被選中行的高亮顏色消失 ( 帶動畫效果 )

UITableView 經常使用方法
l  - (id) dequeueReusableCellWithIdentifier :(NSString *)identifier
經過 identifier ( 緩存 ) 池中找到對應的 UITableViewCell 對象
l  - (void) deleteRowsAtIndexPaths :(NSArray *)indexPaths  withRowAnimation :(UITableViewRowAnimation)animation
移除 indexPaths 範圍內的全部行
l   @property(nonatomic,readonly) UITableViewStyle style  表格樣式 
l   @property(nonatomic,assign)  id dataSource  數據源 
l   @property(nonatomic,assign)  id delegate  代理 
l   @property(nonatomic,getter= isEditing )  BOOL editing  是否爲編輯模式 
l   @property(nonatomic) UITableViewCellSeparatorStyle separatorStyle  設置分隔線的樣式 
l  @property(nonatomic,retain)  UIColor *separatorColor  設置分隔線的顏色

//轉載請註明出處--本文永久連接:http://www.cnblogs.com/ChenYilong/p/3496969.html優化




UITableView 經常使用方法
l  @property(nonatomic,retain)  UIView *tableHeaderView  表頭顯示的視圖
l  @property(nonatomic,retain)  UIView *tableFooterView  表尾顯示的視圖
l  @property(nonatomic)  BOOL allowsSelection
是否容許選中行
l  @property(nonatomic)  BOOL allowsSelectionDuringEditing  是否容許在編輯模式下選中行
l  @property(nonatomic)  BOOL allowsMultipleSelection  是否容許選中多行
l  @property(nonatomic)  BOOL allowsMultipleSelectionDuringEditing  是否容許在編輯模式下選中多行

UITableViewController
l  UIViewController 的子類, UITableViewController 默認扮演了 3 種角色 : 視 圖控制器、 UITableView 的數據源和代理
l  UITableViewController view 是個 UITablView, UITableViewController  負責設置和顯示這個對象。 UITableViewController 對象被建立後,會將這 個 UITableView 對象的 dataSource delegate 指向 UITableViewController 本身




例子 1- 城市信息



例子 2- 淘寶商品列表



例子3 - 數據刪除


例子4 - 編輯模式



例子 5- 九宮格



例子 6- 天貓列表

UITableView (PDF)

©  chenyilong. Powered by  Postach.io


UITableView


 
UITableView
技術博客http://www.cnblogs.com/ChenYilong/  新浪微博http://weibo.com/luohanchenyilong  


UITableView 內置了兩種樣式: UITableViewStylePlain UITableViewStyleGrouped

< UITableViewDataSource , UITableViewDelegate ]] ]]>  裏的方法:
tableView處理步驟
#pragma mark 1. 有多少組
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
#pragma mark 2. section 組頭部控件有多高
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
#pragma mark 3. section 組有多少行
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
#pragma mark 4.indexPath 這行的 cell 有多高
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
#pragma mark 5.indexPath 這行的 cell 長什麼樣子
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
#pragma mark 6. section 組頭部顯示什麼控件
- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section


- (
NSInteger )numberOfSectionsInTableView:( UITableView  *)tableView

- (
NSInteger )tableView:( UITableView  *)tableView numberOfRowsInSection:( NSInteger )section

//每當有一個cell進入視野屏幕就會調用,因此在這個方法內部就須要優化。
- ( UITableViewCell  *)tableView:( UITableView  *)tableView cellForRowAtIndexPath:( NSIndexPath  *)indexPath{
if(cell==nil){
//在這裏面作建立的工做。循環優化。防止刷新cell進入屏幕的時候重複的建立
}
}

//當調用reloadData的時候,會從新刷新調用數據源內全部方法,其餘事情都不會作呀
[self  reloadData ]

//這個方法只有在一開始有多少條數據纔會算多少個高度,這個方法只會調用一次,可是每次reloadData的時候也會調用
//並且會一次性算出全部
cell 的高度,好比有 100 條數據,一次性調用 100
- ( CGFloat )tableView:( UITableView  *)tableView heightForRowAtIndexPath:( NSIndexPath  *)indexPath




-(
NSArray  *)sectionIndexTitlesForTableView:( UITableView  *)tableView  //右側索引

     -(
void )tableView:( UITableView  *)tableView didSelectRowAtIndexPath:( NSIndexPath  *)indexPath  //行點擊事件

NSIndexPath  *path = [ self . tableView  indexPathForSelectedRow ];  //得到被選中的indexPath能夠獲得section,row

[
self . tableView  reloadRowsAtIndexPaths :[ self . tableView  indexPathsForSelectedRows ] withRowAnimation : UITableViewRowAnimationNone ];  //刷新table指定行的數據
      
[
self . tableView  reloadData ];  //刷新table全部行的數據


UITableView
經常使用屬性:
UITableView  *tableView = [[ UITableView  alloc ] initWithFrame : CGRectMake ( 0 ,  0 ,  320 , 460 )  style : UITableViewStylePlain ];  //  初始化表格
分隔線屬性 
tableView.
separatorStyle  =  UITableViewCellSeparatorStyleSingleLine ; //UITableViewCellSeparatorStyleNone;
[ self . tableView  setSeparatorStyle : UITableViewCellSeparatorStyleNone ];  // 取消分隔線
     tableView.
separatorColor  = [ UIColor  lightGrayColor ];

條目多選
tableView.
allowsMultipleSelection  =  YES ;
     
//  設置標題行高
[
_ tableView  setSectionHeaderHeight : kHeaderHeight ];
     [
_ tableView  setSectionFooterHeight : 0 ];

//  設置表格行高
[
_ tableView  setRowHeight : 50 ];

// 設置背景色
self . tableView . backgroundView   優先級高,若是要設置 backgroundColor 的時候要先把 view 設置爲 nil
self . tableView .backgroundColor

// tableView 的頭部或者尾部添加 view,footerView 寬度是不用設置的
      xxxView.bounds = CGRectMake(0,0,0,height);
self . tableView . tableFooterView  =xxxView;
       self . tableView . tableHeaderView  =xxxView;

UIButton  *bt = ( UIButton *)[ self . contentView  viewWithTag :i+ 100 ];

增長 tableview 滾動區域
self . tableView . contentInset  =  UIEdgeInsetsMake ( 0 ,  0 , xx,  0 );  





UITableViewCell

技術博客http://www.cnblogs.com/ChenYilong/  新浪微博http://weibo.com/luohanchenyilong  



//建立UITableViewCell       
UITableViewCell  *cell = [[ UITableViewCell  alloc ]
initWithStyle : UITableViewCellStyleSubtitle  reuseIdentifier : nil ];
      
[cell.
textLabel  setBackgroundColor :[ UIColor  clearColor ]];//  清空標籤背景顏色 
      
      cell.
backgroundView  =xx;  //設置背景圖片
      cell. backgroundVColor  =xx;
      cell.
selectedBackgroundView  = selectedBgView; // 設置選中時的背景顏色

      
cell.accessoryView = xxxView;
  // 設置右邊視圖
[cell  setAccessoryType : UITableViewCellAccessoryNone ]; // 設置右側箭頭

[ self  setSelectionStyle : UITableViewCellSelectionStyleNone ];  // 選中樣式
cell. selectionStyle  =  UITableViewCellSelectionStyleBlue ;

//
設置 cell 的高度
- (
CGFloat )tableView:( UITableView  *)tableView heightForRowAtIndexPath:( NSIndexPath  *)indexPath

contentView 下默認有 3 個子視圖,其中的 2 個是 UILabel ,經過 textLabel detailTextLabel 屬性訪問,第 3 個是 UIImageView ,經過 imageView 屬性訪問 .
UITableViewCellStyleDefault, UITableViewCellStyleValue1, UITableViewCellStyleValue2, UITableViewCellStyleSubtitle

#pragma mark -  從新調整 UITalbleViewCell 中的控件佈局
- ( void )layoutSubviews{
[
super  layoutSubviews ];

}
cell
  裏面還有一個 contentView
UITableViewCell表格優化
UITableViewCell 對象的重用原理:
重用原理:當滾動列表時,部分 UITableViewCell 會移出窗口, UITableView 會將窗口外的 UITableViewCell 放入一個 對象池 中,等待重用。當 UITableView 要求 dataSource 返回 UITableViewCell 時, dataSource 會先查看這個對象池,若是池中有未使用的 UITableViewCell dataSource 會用新的數據配置這個 UITableViewCell ,而後返回給 UITableView ,從新顯示到窗口中,從而避免建立新對象
還有一個很是重要的問題:有時候須要自定義
UITableViewCell (用一個子類繼承 UITableViewCell ),並且每一行用的不必定是同一種 UITableViewCell (如短信聊天佈局),因此一個 UITableView 可能擁有不一樣類型的 UITableViewCell ,對象池中也會有不少不一樣類型的 UITableViewCell ,時可能會獲得錯誤類型的 UITableViewCell 那麼 UITableView 在重用 UITableViewCell 。解決方案: UITableViewCell 有個 NSString * reuseIdentifier 屬性,能夠在初始化 UITableViewCell 的時候傳入一個特定的字符串標識來設置 reuseIdentifier (通常用 UITableViewCell 的類名)。當 UITableView 要求 dataSource 返回 UITableViewCell 時,先經過一個字符串標識到對象池中查找對應類型的 UITableViewCell 對象,若是有,就重用,若是沒有,就傳入這個字符串標識來初始化一個 UITableViewCell 對象

/**
單元格優化
1.
  標示符統一,使用 static 的目的能夠保證表格標示符永遠只有一個
2.
  首先在緩衝池中找名爲 "myCell" 的單元格對象
3.
  若是沒有找到,實例化一個新的 cell
**/

- (
UITableViewCell  *)tableView:( UITableView  *)tableView cellForRowAtIndexPath:( NSIndexPath  *)indexPath{
static  NSString  *cellIdentifier =  @"myCell" ;
UITableViewCell  *cell = [tableView dequeueReusableCellWithIdentifier :cellIdentifier];
//使用這種方法不用判斷下面的cell
UITableViewCell  *cell = [tableView dequeueReusableCellWithIdentifier :cellIdentifier  forIndexPath:indexPath ];
if  (cell ==  nil ) {      
      cell = [[
UITableViewCell  alloc ] initWithStyle : UITableViewCellStyleDefault reuseIdentifier :cellIdentifier];
     }
return  cell;
}

表格的編輯模式
刪除、插入 
- (
void )setEditing:( BOOL )editing animated:( BOOL )animated;  開啓表格編輯狀態 

- (
UITableViewCellEditingStyle )tableView:( UITableView  *)tableView editingStyleForRowAtIndexPath:( NSIndexPath  *)indexPath{
返回表格編輯編輯樣式。不實現默認都是刪除
return editingStyle : UITableViewCellEditingStyleDelete, UITableViewCellEditingStyleInsert

}

- (
void )tableView:( UITableView  *)tableView commitEditingStyle:( UITableViewCellEditingStyle )editingStyle forRowAtIndexPath:( NSIndexPath *)indexPath{
//根據editingStyle處理是刪除仍是添加操做
完成刪除、插入操做刷新表格
- ( void )insertRowsAtIndexPaths:(NSArray *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation;

-(
void )deleteRowsAtIndexPaths:(NSArray *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation;
}

移動
- (
void )tableView:( UITableView  *)tableView moveRowAtIndexPath:( NSIndexPath *)sourceIndexPath toIndexPath:( NSIndexPath  *)destinationIndexPath
sourceIndexPath 移動的行
destinationIndexPath 目標的行

自定義表格行UITableViewCell
storyboard 方式建立:
直接拖到 UITableView 裏面設置 UITableViewCell
注意:
1. 經過 XIB 或者 Storyboard 自定義單元格時,在 xib Storyboard 裏面須要指定單元格的可重用標示符 Identifier

2.注意表格的優化中的差異
Storyboard 二者等效
xxCell  *cell = [tableView  dequeueReusableCellWithIdentifier :CellIdentifier];
xxCell  *cell1 = [tableView  dequeueReusableCellWithIdentifier :CellIdentifier forIndexPath :indexPath];

xib 文件中有差異:
第一種狀況,只能在iOS 6以上使用,若是在viewDidLoad註冊了nib文件,而且指定了「單元格」的可重用標示符,那麼 
      dequeueReusableCellWithIdentifier:
      dequeueReusableCellWithIdentifier:forIndexPath:
      方法是等效的。若是在viewDidLoad中註冊了nib文件,表格緩衝池中的管理,有系統接管!

第二種狀況,是在iOS 4以上都可以使用,若是沒有在viewDidLoad註冊nib文件,那麼,只能使用
      dequeueReusableCellWithIdentifier:而且須要判斷cell沒有被實例化,並作相應的處理


在代碼建立中差異:
用代碼建立
cell 中的處理和 nib 同樣,註冊了 cell 就有系統接管而且能夠用帶 forIndexPath 的方法,沒有註冊就要本身去實例化 cell ,不能用帶 forIndexPath 的方法
[tableView  registerClass :Xxx Cell  class ]  forCellReuseIdentifier : @"xxCell" ];

xib 方式建立:
//註冊Identifier 
- (
void )viewDidLoad{
     [
super  viewDidLoad ];
/**
     
  注意:如下幾句註冊 XIB 的代碼,必定要在 viewDidLoad 中!
     
  註冊 XIB 文件 , 得到根視圖,而且轉換成 TableView, tableView 註冊 xib
      Identifier
名要在 xib 文件中定義,而且保持一致
      **/

UINib  *nib = [ UINib  nibWithNibName : @"BookCell"  bundle :[ NSBundle  mainBundle ]];
UITableView  *tableView = ( UITableView  *) self . view ;
     [tableView
  registerNib :nib  forCellReuseIdentifier : @"bookCell" ]; 
}

//沒有註冊Identifier只能使用下面方法
static  NSString  *CellIdentifier =  @"bookCell" ;
BookCell  *cell = [tableView  dequeueReusableCellWithIdentifier :CellIdentifier];
if  (cell ==  nil ) {
      cell = [[
BookCell  alloc ] initWithStyle : UITableViewCellStyleDefault reuseIdentifier :CellIdentifier];
      
NSBundle  *bundle = [ NSBundle  mainBundle ];
      
NSArray  *array = [bundle  loadNibNamed : @"BookCell"  owner : nil  options : nil ];
      cell = [array
  lastObject ];
     }


代碼方式建立:
創建 UITableViewCell 的類,繼承 UITableViewCell
cell 裏面加入 view 的時候注意點:
// 新建的組件放入 contentView
[
self . contentView  addSubview :xxView]; 

//
設置圖片拉伸屬性 stretch
UIImage  *normalImage = [UIImage imageNamed: @"xx.png" ];
normalImage = [normalImage
  stretchableImageWithLeftCapWidth :
normalImage.
size . width  /  2  topCapHeight :normalImage. size . height  /  2 ];

//在tableView裏面viewDiDLoad裏面要註冊cell類
[tableView  registerClass :Xxx Cell  class ]  forCellReuseIdentifier : @"xxCell" ];

自定義表格中Header
//自定義表格在這個方法中定義
-( UIView  *)tableView:( UITableView  *)tableView viewForHeaderInSection:( NSInteger )section
-(
NSString  *)tableView:( UITableView  *)tableView titleForHeaderInSection:( NSInteger )section
 
©  chenyilong. Powered by  Postach.io
相關文章
相關標籤/搜索