前一段時間,公司招聘了一個新員工,界面做出來了,但是很卡,我看完他寫的代碼,發現沒有對UITableViewCell進行循環使用,而且在UITableView代理方法中,創建了很多并沒有什么用的對象,一些調用頻繁的方法也沒有很好地處理。
首先創建一個UITableView.設置數據源為控制器,并實現數據源方法。
設置行高:
table.rowHeight =70;
既然遵守數據源方法,那就實現數據源方法
返回cell的方法,蘋果默認— 用到時再創建,但是會頻繁的創建,銷毀,造成浪費
所以優化—里面的代碼就先去緩存池子中尋找:(找不到)我們創建
注意點:關于cell的數據,不要放置在判斷里面,因為這個方法只有在一開始創建cell的時候才會調用,后面循環利用的時候就會導致數據錯亂。
被static修飾的局部變量:只會初始化一次,在整個程序運行中,只有一份內存。
定義重用標識:static NSString*ID = @"cell";
cell的樣式有好幾種:(紅色代表常用)
UITableViewCellStyleDefault 默認樣式
UITableViewCellStyleValue1, 樣式一
UITableViewCellStyleValue2, 樣式二
UITableViewCellStyleSubtitle 帶有子標題模式的樣式
最新cell的循環利用方法:
利用標識來注冊一個帶有標識的cell:(前提:通過stroyBoard創建的UITableView,那么要拖線拿到它)
這個只注冊一次,所以在ViewDidLoad中注冊
好處:不用判斷緩存池子的cell是否為空,只要注冊了cell,那么創建出來絕對有值。
TableView代理方法:
代理方法肯定要遵守代理協議:
@interfaceViewController ()<UITableViewDelegate>
常用代理方法:
每一行的高度也可以這樣設置— self.tableView.rowHeight = 100;
當時上面的高度方法可以搞定不一樣的cell高度設置
這里引出一個估計cell高度的方法:(針對微博方面)
這里引出兩個樣式:(也可以在stroyboard中選擇)
這個也是代理方法:與那個返回頭部高度容易混淆,要記住返回值類型
tableView的代理方法,默認繼承了UIScrollViewDelegate
@protocol UITableViewDelegate<NSObject,UIScrollViewDelegate>
所以可以直接使用這個方法監聽tableView的滾動
// 監聽tableView 的滾動
- (void)scrollViewDidScroll:(UIScrollView*)scrollView
說到TableViewController,在MainStoryBoard中:
一般新手會直接將類型名改為UITableViewController,這樣就導致錯誤出現
注意點:錯誤將UIViewController當做UITableViewController來用
其實添加
做好上面這一步在UITableViewController里面:
默認:
self.view == self.tableView,是同一個對象。
默認:
self.tableView.dateSource= self;
self.tableView.delegate = self
cell的循環利用(第三種思路)
選中cell,點擊重用標識
這樣在代碼中,就可以省略掉:那個判斷語句:if(cell== nil){創建cell的方法}
以后在tableView中開發一個cell
pragma mark - 創建、設置cell
抽出cell
- (UITableViewCell *)cell:(UITableView*)tableView indexPath:(NSIndexPath*)indexPath
{
//0.重用標識
//被static修飾的局部變量:只會初始化一次,在整個程序運行過程中,只有一份內存
staticNSString*ID = @"cell";
//1.先根據cell的標識去緩存池中查找可循環利用的cell
UITableViewCell*cell = [tableViewdequeueReusableCellWithIdentifier:ID];
//2.覆蓋數據
cell.textLabel.text = [NSString stringWithFormat:@"cell- %zd", indexPath.row];
returncell;
}
效果圖
tableView的常見設置:
從iOS7以后,分割線變成了兩變都有間距,所以如果要達到一條線貫穿整個cell,那就添加一個View,設置它粘著cell的底部。。
添加一個UIView,設置左右下部約束,高度約束設為1,就可以看到一條線貫穿整個cell的底部了。
- (void)ViewDidLoad
{
[Super ViewDidLoad];
[self.tableView setSeparatorInset:UIEdgeInsetsZero];
[self.tableView setLayoutMargins:UIEdgeInsetsZero];
}
在cell將要顯示出來的方法中執行下面的代碼
- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
[cell setSeparatorInset:UIEdgeInsetsZero];
[cell setLayoutMargins:UIEdgeInsetsZero];
}
cell的樣式設置
注意:SeparatorStyleNone取消選中樣式,上面還有一個,長得很像
系統自帶的方法:只能控制cell的顏色選中為灰色,或者沒有。在iOS6之前是可以實現的
如果想自定義選中cell的背景顏色:(也可以設置圖片,UIImage等等,都可以設置)
如果設置不選中cell的背景顏色(兩種方法)
cell.backGroundColor = [UIColor redColor];
另一種設置方法cell.backgroundView
以上兩種都可以,但是后面的VIew優先級比較高
cell的右邊展示例如箭頭,加號等
// 設置指示器(灰色小箭頭)
cell.accessoryType=UITableViewCellAccessoryDisclosureIndicator;
如果想自定義,例如美工做一個漂亮的指示器圖片(當然按鈕也是可以的)
cell.accessoryView = [[UIImageView alloc] initWithImage:];