我的平台是ios8和xcode 6.3.1 tableview的代表是这样的:
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
return 3;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return 1;
}
所以,heightForRowAtIndexPath:的委托应该执行三次,但我的代码执行四次,为什么?
我的代码:
init tableView
- (void)setupTableView {
_selectTableView = [[UITableView alloc] initWithFrame:self.view.bounds style:UITableViewStylePlain];
_selectTableView.delegate = self;
_selectTableView.dataSource = self;
_selectTableView.separatorStyle = UITableViewCellSeparatorStyleNone;
[self.view addSubview:_selectTableView];
}
其他委托方法:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
NSInteger section = indexPath.section;
static NSString *identified = @"selectCell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identified];
if (cell == nil) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identified];
cell.selectionStyle = UITableViewCellSelectionStyleNone;
}
return [self cellWith:cell andSection:section];
}
- (UITableViewCell *)cellWith:(UITableViewCell *)cell andSection:(NSInteger)section {
....
return cell;
}
- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section {
CGFloat height = 0;
if (section != SVCellTypeHot) {
height = 5;
}
return height;
}
- (UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section {
UIView *footerView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, kScreenSize.width, 5)];
[footerView setBackgroundColor:[UIColor lightGrayColor]];
return footerView;
}
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
CGFloat height = 0;
switch (indexPath.section) {
case SVCellTypeBanner:
{
height = kHeaderViewHeigth;
}
break;
case SVCellTypeRecommand:
{
height = kRecommandViewHeight;
}
break;
case SVCellTypeHot:
{
height = kHotViewHeight;
}
break;
default:
break;
}
return height;
}
答案 0 :(得分:0)
heightForRowAtIndexPath:
将根据需要执行多次。例如,如果您正在滚动,它将在屏幕外单元格即将出现时执行。该方法应始终能够提供正确的高度,通常不应该关注它的调用频率。 cellForRowAtIndexPath:
执行3次。
答案 1 :(得分:0)
heightForRowAtIndexPath
允许委托指定具有不同高度的行。如果实现此方法,则它返回的值将覆盖为给定行为UITableView的rowHeight属性指定的值。没有任何保证,此方法只能被称为“项目计数*项目计数'在UITableView中的时间。从你的名字可以看出,它将计算IndexPath
处单元格的高度,因此结合re-using
技术,只要需要计算高度,就会多次调用此方法对于IndexPath
实际上,决定应该调用多少次以及何时调用它是一种系统行为。在您的评论中,似乎在indexPath {1-0}中发生了某些变化,因此{1}}会调用heightForRowAtIndexPath
两次。您可能需要检查是否更改了导致iOS重新计算单元格高度的任何内容。
在不了解更多细节的情况下,我们可以做的最好的事情是为您提供调试的线索。但是,您不应该依赖它调用heightForRowAtIndexPath
的次数,同样,只要您滚动或更改该单元格内的任何帧,就可以随时调用它。