15

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

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

但是,我怎么能让一个带有“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;
}
4

5 回答 5

17

更新

现在使用 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;
  }
}

注意:如果您的尺寸不固定,那么您将计算它然后根据您的要求在上述方法中提供。

于 2012-06-28T20:55:56.853 回答
1

你不应该cellForRowAtIndexPath在内部调用,heightForRowAtIndexPath否则你会进入一个无限循环,这将导致应用程序崩溃。

您应该以与确定相同单元格类型相同的方式确定每个单元格的高度cellForRowAtIndexPath

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

于 2012-06-28T21:30:01.593 回答
0

您将完全按照您在cellForRowAtIndexPath:. 如果您没有按部分对它们进行分组,那么您必须轮询您的数据以查找相关的特定 indexPath,然后确定高度。

于 2012-06-28T20:54:25.787 回答
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...)
}
于 2012-06-28T20:55:52.217 回答
0

当然它崩溃了,因为你在一个委托方法中,(你是一个委托UITableView)并且从这样的方法回调这些UITableView方法有很高的崩溃风险。

您调用的方法 ( [tableView cellForRowAtIndexPath:indexPath]) 将再次为单元格的高度调用委托方法,它会导致无限循环,也就是崩溃。

这是正常行为。

关键在您的原始数据源中,您可以将每一行的高度存储在原始数据源中,并且您可以从那里读取所有内容,在您的委托方法中没有任何风险。

您的代码片段没有说明您的数据源在哪里以及您的数据源是什么类型,因此在缺少它的情况下我无法给出更准确的解决方案,但想法就是这样。

于 2012-06-28T21:38:32.327 回答