【问题标题】:Different UITableViewCell heights不同的 UITableViewCell 高度
【发布时间】:2012-06-30 10:44:10
【问题描述】:

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

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

但是,我怎样才能让带有“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;
}

【问题讨论】:

    标签: iphone objective-c ipad uitableview


    【解决方案1】:

    更新

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

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

    【讨论】:

    • 我忘了说,我不知道哪个单元格在哪个索引处,它的用户内容在这里列出。所以这行不通。
    【解决方案2】:

    你不应该在heightForRowAtIndexPath中调用cellForRowAtIndexPath,否则你会进入一个无限循环,导致应用崩溃。

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

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

    【讨论】:

      【解决方案3】:

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

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

      这是正常行为。

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

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          【解决方案5】:

          我会为每个 UITableView 单元格设置标签,以便在 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...)
          }
          

          【讨论】:

          • 已编辑问题,我尝试了标签但失败了(请参阅我的问题中的尝试)。
          • 对,但是你是如何设置这些标签的?你能发一下吗?
          • hm 我通常在 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 中设置我的标签,但是你应该能够在故事板中设置标签...跨度>
          • 我就是这么想的。它根本不喜欢这样:[self.tableView cellForRowAtIndexPath:indexPath]。现在这只是一种预感,但dequeueReusableCellWithIdentifier 会不喜欢这个吗?
          • 不,这不会影响任何事情。您是否正确设置了 tableview 委托和数据源?除此之外,这应该可以正常工作...
          猜你喜欢
          • 2011-06-02
          • 2016-01-25
          • 1970-01-01
          • 1970-01-01
          • 2015-04-25
          • 2015-08-29
          • 1970-01-01
          • 1970-01-01
          • 2011-09-13
          相关资源
          最近更新 更多