tableView(tableView: UITableView, estimatedHeightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat
这个方法用于返回一个 cell 的预估高度,如果在程序中实现了这个方法,tableview 首次加载的时候就不会调用heightForRowAtIndexPath
方法,而是用estimatedHeightForRowAtIndexPath
返回的预估高度计算 tableview 的总高度,然后 tableview 就可以显示出来了,等到 cell 可见的时候,再去调用heightForRowAtIndexPath
获取 cell 的正确高度。
通过使用 estimatedHeightForRowAtIndexPath
这个 Delegate 方法,解决了首次加载 table view 出现的性能问题。但还有一个麻烦的问题,就是在 cell 没有被加载的时候计算 cell 的高度,上面给出的代码中,仅仅是计算一个 NSString 的高度,就需要不少代码了。这种计算实际上是必须的,然而在 iOS 8 开始,你可能可以不用再写这些烦人的计算代码了!前提是你要会使用 storyboard。
在 iOS 8 中,self size cell 提供了这样一种机制:cell 如果有一个确定的宽度/高度,autolayout 会自动根据 cell 中的内容计算出对应的高度/宽度。
请看:
*** iOS 8 自适应 Cell ***
.
2、 cell重用问题
官网是这样子说的。
// if the cell is reusable (has a reuse identifier), this is called just before the cell is returned from the table view method dequeueReusableCellWithIdentifier:. If you override, you MUST call super.
- (void)prepareForReuse{
[super prepareForReuse];
}
*** 解决tableView滚动导致数据混乱 准备重用,防止滚动出现数据错乱 ,你可以在里面设置值为nil,例如:***
self.timeLineBill = nil;
self.categoryImageBtn.imageView.image = nil;
在使用cell时作为网络,还需要在这里通知取消掉前一次网络请求.不要再给这个cell发数据
,下面的方法是可以简单的根据identifier 进行重用,数据复杂时就不可以了。
static NSString *CellIdentifier = @"Identifier";
cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}