【问题标题】:UITableViewCell: Dynamic Cell Height by 'Cell Identifier'UITableViewCell:“单元格标识符”的动态单元格高度
【发布时间】:2014-09-04 13:43:54
【问题描述】:

(注意:我使用的 tableView 来自 Parse.com iOS SDK - PFQueryTableViewController)

场景 = 我有一个 TableViewController,它有两种不同类型的单元格(每个都有自己的标识符)。如果对象上的键为真,则在查询并加载到数据源时检查每个对象。根据结果​​,我将ReusableCellWithIdentifier 出列到正确的单元格。

-(PFTableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath object:(PFObject *)object {

    myTableViewCell *cell;

    if ([object[@"orientation"] isEqualToString:@"left"] || [object[@"orientation"] isEqualToString:@"right"]) {

        myTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell"];

    else {

        myTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell2"];
    }

这一切都发挥了作用。每个单元格都在正确的 indexPath.row 和所有内容中加载。问题是我的 tableView“行高”本身不会为新单元格重新调整。这会导致单元格重叠并使一切变得丑陋。我可以告诉情节提要中的 tableView 将行高设置为两个单元格高度中较大的一个,但这也会在单元格之间留下很大的空间,这也使它看起来很丑。

问题 = 我认为(如果我错了,请纠正我)我需要使用

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

方法来实现这一点。我需要帮助的地方是我不确定如何根据我在 cellForRowAtIndexPath 方法中为每个单元格提供的“标识符”来设置 indexPath 处每个单元格的高度。

我在寻找什么 = 类似这样的东西(请原谅 SuedoCode)

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

    if ([cell.identifier isEqual:@"Cell"] {

    return 100;

    }

    else {

    return 200;

    }
}

回答:我想通了!(我将下面的答案标记为已接受,因为它为我指明了正确的方向)

因为我使用的是 PFQueryTableViewController,所以我必须这样做......

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

    PFObject *object = [self.objects objectAtIndex:indexPath.row];

    if ([object[@"orientation"] isEqual:@"left"] || [object[@"orientation"] isEqual:@"right"]) {

        return 100;
    }

    else {

       return 200;
    }

}

【问题讨论】:

  • 你在正确的轨道上。您需要“返回 SomeHeight;”,而不是 self.tableView.rowHeight。每一行都会调用此方法,因此您将在所述索引路径处返回所述行的高度。
  • 谢谢!我很困惑。我在上面的 我在寻找什么 部分输入的不是可运行的代码。因为您无法通过这种方式检查 cell.identifier 。我的问题是如何那么我该怎么做呢?请原谅不返回任何部分或我的问题。这不是复制和粘贴。我在问题中写了它。我遇到的问题不是因为我的项目中缺少该代码。
  • @TomTesticool,您可以将cellIdentifier 存储在您的模型中,您可以从原始模型中以–tableView:heightForRowAtIndexPath: 方法调用它(因为您会调用任何其他信息在–tableView:cellForRowAtIndexPath: 方法中构建单元格)。

标签: ios uitableview


【解决方案1】:

首先,要记住一些事情。 heightForRowAtindexPath 在 CellForRowatIndexPath 之前调用,简单地说,如果 object 在 indexPath X,则返回 Y 或 Z。

更正确的方法可能是子类化 tableCell 类,在 .h 文件中设置一个属性,然后找出路径...我给你一个肮脏的方法:)

创建一个 NSMutableArray 属性(不要忘记在某处/以某种方式对其进行初始化),并根据您的数据源,使用高度 A 或高度 B(浮点数)填充它。现在,回到 heightForRowAtIndexPath,你可以说一些大意为:

return (int)self.myMutableArray[indexPath.row];

【讨论】:

  • 我喜欢你的肮脏建议:)。看起来它应该工作。但是当我尝试它时,我得到,'*** -[__NSArrayM objectAtIndex:]: index 0 beyond bounds for empty array'。
  • 你忘了做 self.myMutableArray = [NSMutableArray array]; (如有疑问,只需在 viewDidLoad 中粘贴该行即可:)
  • 我所做的是,.h - @property NSMutableArray *mutableArray; // viewDidLoad - mutableArray = [NSMutableArray alloc]init]; // cellForRowAtIndexPath - [mutableArray addObject:@"floatString"]; // heightForRowAtIndexPath - 返回 [[mutableArray objectAtIndex:indexPath.row]floatValue]
  • 我做了 mutableArray = [NSMutableArray array];它仍然是'*** - [__NSArrayM objectAtIndex:]:索引0超出空数组的范围'。 :(
  • 两种可能。一些拼写错误并且数组不是初始化的(所以它是空的),或者一些拼写错误并且你没有填充数组(所以它是空的)。你离得很近。只需在调试器中设置断点并遍历代码。第三种可能性......我可能记错了,但您可能不需要分配属性数组。只需执行 self.mutableArray = [NSMutableArray array];
猜你喜欢
  • 2010-10-13
  • 1970-01-01
  • 2014-06-23
  • 2016-08-16
  • 2017-11-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多