UItableView和UIcollectionView是日常生活中應(yīng)用最多的,可以實現(xiàn)很多功能,創(chuàng)建的方式也有幾種,下面簡單總結(jié)下,創(chuàng)建UItableViewCell的幾種情況:
1.通過加載storyBoard的UItableViewCell
在sotrybord中拖入的tableView中,選中Content,里面就有靜態(tài)cell和動態(tài)cell了。其中兩者的區(qū)別是,靜態(tài)cell固定不動,直接通過控制面板添加屬性就可以創(chuàng)建了,而動態(tài)cell也就是當(dāng)我們拖入tableView,需要實現(xiàn)數(shù)據(jù)源方法才有數(shù)據(jù)顯示的就是動態(tài)cell。
動態(tài)cell代碼如下:
```
- (NSInteger) numberOfSectionsInTableView:(UITableView *)和- (NSInteger)
numberOfSections方法默認(rèn)是1組,這個代理方法可以不寫,如果不寫那么,系統(tǒng)默認(rèn)是一組
-tableView(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
```
這兩個方法是必須實現(xiàn)的,如果不實現(xiàn),那么系統(tǒng)會崩潰。其中系統(tǒng)的UITableViewCell有三個自帶的屬性分別是:imageView 、textLabel、detailTextLabel 。分別給三個屬性賦值,實現(xiàn)了最基本的數(shù)據(jù)源方法,那么基本就有數(shù)據(jù)顯示了。
2.通過代碼創(chuàng)建UItableViewCell
代碼創(chuàng)建UItableViewCell,其中代碼需要明白為什么需要自定義代碼創(chuàng)建cell?
代碼創(chuàng)建cell,主要是因為系統(tǒng)的cell不能滿足開發(fā)的需要。這里普及下cell的重用機制。每一個UITableView里都維護著一個cell隊列,當(dāng)UITableView剛加載的時候,cell隊列里是沒有任何數(shù)據(jù)的。dequeueResableCellWithIdentifier從字面上理解就是”出列可重用的cell",也就是根據(jù)一個標(biāo)識identifier從cell隊列里取出一個UITableViewCell,也就是從緩沖池加載cell,當(dāng)然了,如果cell隊列里沒有此標(biāo)識的cell,調(diào)用此方法的結(jié)果就是返回nil。因此,在UITableView剛加載的時候,cell隊列里沒有可用的cell,所以必須通過語句
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
來創(chuàng)建對應(yīng)CellIdentifier標(biāo)識的UITableViewCell實例。
[ tableView:cellForRowAtIndexPath:方法主要是根據(jù)nsindex取得一個cell ]
而當(dāng)UITableView在滾動的時候?qū)е耈ITableViewCell滾出手機屏幕視圖的時候,程序會將這一個UITalbeViewCell實例放入此UITableView所維護的cell隊列中(緩沖池中)。當(dāng)UITableview中有新的UITableViewCell需要展現(xiàn)在手機屏幕視圖上時,就會調(diào)用tableView:cellForRowAtIndexPath:方法了。因此我們可以知道以下幾點:
1-重取出來的cell是有可能已經(jīng)捆綁過數(shù)據(jù)或者加過子視圖的,所以,如果有必要,要清除數(shù)據(jù)(比如textlabel的text)和remove掉add過的子視圖(使用tag)。
2-這樣設(shè)計的目的是為了避免頻繁的 alloc和delloc cell對象而已,沒有多復(fù)雜。
3-設(shè)計的關(guān)鍵是實現(xiàn)cell和數(shù)據(jù)的完全分離
重點代碼:
在自定義的cell的.m文件返回自定義的cell
+ (instancetype) heroCell:(UITableView *)tableView
{
static NSString *ID=@"hero";
//1.查找可重用cell
CZHeroCell *cell=[tableView dequeueReusableCellWithIdentifier:ID];
//2.判斷是否成功獲取了可重用cell,如果沒有,則創(chuàng)建
if (cell==nil) {
cell=[[CZHeroCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:ID];
}
//3.返回
return cell;
}
那么在控制器的數(shù)據(jù)源方法中,就可以直接調(diào)用封裝好的創(chuàng)建cell的方法,直接創(chuàng)建cell。
3.用xib創(chuàng)建cell
其中用xib創(chuàng)建cell的時候,需要注意的是在自定義cell的類中,需要告訴cell是通過xib 創(chuàng)建的
+ (instancetype)tgCell ?//封裝cell
{
//創(chuàng)建cell--告訴從xib文件創(chuàng)建cell
NSBundle *bundle=[NSBundle mainBundle];
CZTgCell *cell=[[bundle loadNibNamed:@"CZTgCell" owner:nil options:nil] lastObject];
return cell;
}
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?2016.3.12