不同的UITableViewCell高度

时间:2012-06-28 20:50:51

标签: iphone objective-c ipad uitableview

我在故事板中构建了三个不同的单元格,并将所有出口连接起来,每个单元格都有一个唯一的标识符。

例如,我有一个包含图片的单元格,另一个包含标签的单元格,另一个包含其他内容,因此它们都是唯一的,每个单元格类型都需要自己的高度(动态或状态,无关紧要)。

但是,我怎么能让'indentifier1'的单元格返回一定的高度然后其他单元格返回不同的高度呢?

我知道我可以使用- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath,但我不确定如何区分细胞。

我正在使用核心数据并从中获取tableview的结果。

修改

我尝试使用标签,但在第一个if语句中崩溃:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    CGFloat cellHeight;

    if ([[tableView cellForRowAtIndexPath:indexPath] tag] == 1) cellHeight = 170;
    else if ([[tableView cellForRowAtIndexPath:indexPath] tag] == 2) cellHeight = 100;
    else if ([[tableView cellForRowAtIndexPath:indexPath] tag] == 3) cellHeight = 140;

    return cellHeight;
}

5 个答案:

答案 0 :(得分:16)

<强>更新

现在使用UITableView的动态高度,因为UITableView会自动计算它

以下是您的要求使用此方法的示例:

 - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{

  //calculate height according to text and on basis of indexPath
  if(indexpath.row == 0)
  {
    return 60.0f;
  }
  else if(indexpath.row == 1)
  {
    return 70.0f;
  }
  else
  {
    return 55.0f;
  }
}

注意:如果您的尺码没有修好,那么您将对其进行计算,然后根据您的要求提供上述方法。

答案 1 :(得分:1)

您不应在cellForRowAtIndexPath内拨打heightForRowAtIndexPath,否则您将进入无限循环,导致应用崩溃。

您应该像确定cellForRowAtIndexPath中同一单元格的类型一样确定每个单元格的高度。

这是我认为的唯一解决方案。

答案 2 :(得分:0)

您可以在cellForRowAtIndexPath:中完全区分它们。如果您没有按部分对它们进行分组,那么您必须轮询有关特定indexPath的数据,并确定之后的高度。

答案 3 :(得分:0)

我会为每个UITableView Cell设置标记,以便在heightForRowAtIndexPath中,您可以通过以下方式进行区分:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
if ([self.tableview cellForRowAtIndexPath:indexPath].tag == yourTag){
     //perform your action for cell 1, 2, or 3
  }
else if (etc...)
}

答案 4 :(得分:0)

当然它崩溃了,因为你是一个委托方法,(你是{{​​1}}的代表),并且从这种方法回调UITableView方法会有很高的崩溃风险。 / p>

你调用的方法(UITableView)将再次为单元格的高度调用委托方法,它会导致无限循环,即崩溃。

这是正常行为。

密钥位于原始数据源中,您可以存储原始数据源中每一行的高度,并且您可以在代理方法中从那里读取所有内容,而不会有任何风险。

你的代码片段没有说明你的数据源在哪里以及你的数据源是什么类型,因此我无法提供更准确的解决方案,但是想法就是这样。