为什么tableview的委托方法heightForRowAtIndexPath:再执行一次?

时间:2015-05-25 01:23:53

标签: ios uitableview ios8

我的平台是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;
}

2 个答案:

答案 0 :(得分:0)

heightForRowAtIndexPath:将根据需要执行多次。例如,如果您正在滚动,它将在屏幕外单元格即将出现时执行。该方法应始终能够提供正确的高度,通常不应该关注它的调用频率。 cellForRowAtIndexPath:执行3次。

答案 1 :(得分:0)

heightForRowAtIndexPath允许委托指定具有不同高度的行。如果实现此方法,则它返回的值将覆盖为给定行为UITableView的rowHeight属性指定的值。没有任何保证,此方法只能被称为“项目计数*项目计数'在UITableView中的时间。从你的名字可以看出,它将计算IndexPath处单元格的高度,因此结合re-using技术,只要需要计算高度,就会多次调用此方法对于IndexPath

的单元格

实际上,决定应该调用多少次以及何时调用它是一种系统行为。在您的评论中,似乎在indexPath {1-0}中发生了某些变化,因此{1}}会调用heightForRowAtIndexPath两次。您可能需要检查是否更改了导致iOS重新计算单元格高度的任何内容。

在不了解更多细节的情况下,我们可以做的最好的事情是为您提供调试的线索。但是,您不应该依赖它调用heightForRowAtIndexPath的次数,同样,只要您滚动或更改该单元格内的任何帧,就可以随时调用它。