前一段時(shí)間,公司招聘了一個(gè)新員工,界面做出來(lái)了,但是很卡,我看完他寫的代碼,發(fā)現(xiàn)沒(méi)有對(duì)UITableViewCell進(jìn)行循環(huán)使用,而且在UITableView代理方法中,創(chuàng)建了很多并沒(méi)有什么用的對(duì)象,一些調(diào)用頻繁的方法也沒(méi)有很好地處理。
首先創(chuàng)建一個(gè)UITableView.設(shè)置數(shù)據(jù)源為控制器,并實(shí)現(xiàn)數(shù)據(jù)源方法。

設(shè)置行高:
table.rowHeight =70;
既然遵守?cái)?shù)據(jù)源方法,那就實(shí)現(xiàn)數(shù)據(jù)源方法

返回cell的方法,蘋果默認(rèn)— 用到時(shí)再創(chuàng)建,但是會(huì)頻繁的創(chuàng)建,銷毀,造成浪費(fèi)
所以優(yōu)化—里面的代碼就先去緩存池子中尋找:(找不到)我們創(chuàng)建
注意點(diǎn):關(guān)于cell的數(shù)據(jù),不要放置在判斷里面,因?yàn)檫@個(gè)方法只有在一開始創(chuàng)建cell的時(shí)候才會(huì)調(diào)用,后面循環(huán)利用的時(shí)候就會(huì)導(dǎo)致數(shù)據(jù)錯(cuò)亂。

被static修飾的局部變量:只會(huì)初始化一次,在整個(gè)程序運(yùn)行中,只有一份內(nèi)存。
定義重用標(biāo)識(shí):static NSString*ID = @"cell";
cell的樣式有好幾種:(紅色代表常用)
UITableViewCellStyleDefault 默認(rèn)樣式
UITableViewCellStyleValue1, 樣式一
UITableViewCellStyleValue2, 樣式二
UITableViewCellStyleSubtitle 帶有子標(biāo)題模式的樣式
最新cell的循環(huán)利用方法:
利用標(biāo)識(shí)來(lái)注冊(cè)一個(gè)帶有標(biāo)識(shí)的cell:(前提:通過(guò)stroyBoard創(chuàng)建的UITableView,那么要拖線拿到它)

這個(gè)只注冊(cè)一次,所以在ViewDidLoad中注冊(cè)
好處:不用判斷緩存池子的cell是否為空,只要注冊(cè)了cell,那么創(chuàng)建出來(lái)絕對(duì)有值。
TableView代理方法:
代理方法肯定要遵守代理協(xié)議:
@interfaceViewController ()<UITableViewDelegate>

常用代理方法:

每一行的高度也可以這樣設(shè)置— self.tableView.rowHeight = 100;
當(dāng)時(shí)上面的高度方法可以搞定不一樣的cell高度設(shè)置
這里引出一個(gè)估計(jì)cell高度的方法:(針對(duì)微博方面)

這里引出兩個(gè)樣式:(也可以在stroyboard中選擇)

這個(gè)也是代理方法:與那個(gè)返回頭部高度容易混淆,要記住返回值類型

tableView的代理方法,默認(rèn)繼承了UIScrollViewDelegate
@protocol UITableViewDelegate<NSObject,UIScrollViewDelegate>
所以可以直接使用這個(gè)方法監(jiān)聽(tīng)tableView的滾動(dòng)
// 監(jiān)聽(tīng)tableView 的滾動(dòng)
- (void)scrollViewDidScroll:(UIScrollView*)scrollView
說(shuō)到TableViewController,在MainStoryBoard中:
一般新手會(huì)直接將類型名改為UITableViewController,這樣就導(dǎo)致錯(cuò)誤出現(xiàn)

注意點(diǎn):錯(cuò)誤將UIViewController當(dāng)做UITableViewController來(lái)用
其實(shí)添加


做好上面這一步在UITableViewController里面:
默認(rèn):
self.view == self.tableView,是同一個(gè)對(duì)象。
默認(rèn):
self.tableView.dateSource= self;
self.tableView.delegate = self
cell的循環(huán)利用(第三種思路)

選中cell,點(diǎn)擊重用標(biāo)識(shí)
這樣在代碼中,就可以省略掉:那個(gè)判斷語(yǔ)句:if(cell== nil){創(chuàng)建cell的方法}
以后在tableView中開發(fā)一個(gè)cell

pragma mark - 創(chuàng)建、設(shè)置cell
抽出cell
- (UITableViewCell *)cell:(UITableView*)tableView indexPath:(NSIndexPath*)indexPath
{
//0.重用標(biāo)識(shí)
//被static修飾的局部變量:只會(huì)初始化一次,在整個(gè)程序運(yùn)行過(guò)程中,只有一份內(nèi)存
staticNSString*ID = @"cell";
//1.先根據(jù)cell的標(biāo)識(shí)去緩存池中查找可循環(huán)利用的cell
UITableViewCell*cell = [tableViewdequeueReusableCellWithIdentifier:ID];
//2.覆蓋數(shù)據(jù)
cell.textLabel.text = [NSString stringWithFormat:@"cell- %zd", indexPath.row];
returncell;
}
效果圖

tableView的常見(jiàn)設(shè)置:

從iOS7以后,分割線變成了兩變都有間距,所以如果要達(dá)到一條線貫穿整個(gè)cell,那就添加一個(gè)View,設(shè)置它粘著cell的底部。。
添加一個(gè)UIView,設(shè)置左右下部約束,高度約束設(shè)為1,就可以看到一條線貫穿整個(gè)cell的底部了。

- (void)ViewDidLoad
{
[Super ViewDidLoad];
[self.tableView setSeparatorInset:UIEdgeInsetsZero];
[self.tableView setLayoutMargins:UIEdgeInsetsZero];
}
在cell將要顯示出來(lái)的方法中執(zhí)行下面的代碼
- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
[cell setSeparatorInset:UIEdgeInsetsZero];
[cell setLayoutMargins:UIEdgeInsetsZero];
}
cell的樣式設(shè)置
注意:SeparatorStyleNone取消選中樣式,上面還有一個(gè),長(zhǎng)得很像

系統(tǒng)自帶的方法:只能控制cell的顏色選中為灰色,或者沒(méi)有。在iOS6之前是可以實(shí)現(xiàn)的

如果想自定義選中cell的背景顏色:(也可以設(shè)置圖片,UIImage等等,都可以設(shè)置)

如果設(shè)置不選中cell的背景顏色(兩種方法)
cell.backGroundColor = [UIColor redColor];
另一種設(shè)置方法cell.backgroundView

以上兩種都可以,但是后面的VIew優(yōu)先級(jí)比較高
cell的右邊展示例如箭頭,加號(hào)等
// 設(shè)置指示器(灰色小箭頭)
cell.accessoryType=UITableViewCellAccessoryDisclosureIndicator;
如果想自定義,例如美工做一個(gè)漂亮的指示器圖片(當(dāng)然按鈕也是可以的)
cell.accessoryView = [[UIImageView alloc] initWithImage:];