【问题标题】:Is there any reason why we don't simply declare cellForRowAtIndexPath like this:我们有什么理由不像这样简单地声明 cellForRowAtIndexPath :
【发布时间】:2012-12-04 03:41:13
【问题描述】:
-(float)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
    UITableViewCell * cell = [self.tableView cellForRowAtIndexPath:indexPath];
    return cell.bounds.size.height;
}

有什么缺点?

我改了

-(float)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
    UITableViewCell * cell = [self tableView:tableView cellForRowAtIndexPath:indexPath];
    return cell.bounds.size.height;
}

【问题讨论】:

  • 我不认为第一个是合法的Objective-C语法。
  • (我不确定哪一个是个好主意。)
  • 这个问题和声明tableView:cellForRowAtIndexPath:方法有什么关系?
  • @HotLicks 第一个很好(语法上)。 UITableView 有一个方法可以直接获取这样的单元格。
  • @rmaddy -- 好的,这是有道理的 -- 不同类的两种不同方法。乍一看,OP 似乎试图将属性语法与常规方法调用语法混合在一起。

标签: objective-c uitableview xcode4.5


【解决方案1】:

正如 rmaddy 指出的那样,您不能使用第一个版本,因为-[UITableView cellForRowAtIndexPath:] 会导致表格视图再次向您发送tableView:heightForRowAtIndexPath:,从而导致无限递归。

如果您使用的是一组静态单元格,并且为表格的每一行预先分配了一个单元格,那么第二个版本就可以了。

如果您为行动态创建单元格,第二个版本最终会耗尽您的表格视图的重用队列,然后为每一行创建另一个单元格,因为tableView:cellForRowAtIndexPath: 返回一个自动释放的对象。在运行循环结束之前,这些单元格都不会被释放,因此除了创建和销毁所有这些单元格的时间成本之外,您还使用与表中的行数成正比的内存。如果您想这样做,并且有很多行,您可能需要使用显式自动释放池:

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
    @autoreleasepool {
        UITableViewCell *cell = [self tableView:tableView cellForRowAtIndexPath:indexPath];
        return cell.bounds.size.height;
    }
}

【讨论】:

    【解决方案2】:

    通常,您会希望从表格中获取一个单元格,就像您在第一段代码中所做的那样。但在这种情况下,你不能。如果您尝试,您将在cellForRowAtIndexPathheightForRowAtIndexPath 之间进行递归调用。

    如果您必须从heightForRowAtIndexPath 方法中获取单元格,则不得向表格询问该单元格。

    【讨论】:

    • 正如 rob 指出的那样,当您向表格询问单元格时,表格首先尝试获取单元格的高度。当它试图获取高度时,您向表格询问单元格。这种情况一直持续到堆栈溢出并且应用程序崩溃。
    • @SharenEayrs cellForRowAtIndexPath 方法在行可见时返回一个单元格,如果行不可见则返回 nil。要确定哪些行是可见的,表格视图必须知道每个单元格的高度。
    • 这看起来很傻。为什么在知道它是否可见之前需要先知道单元格的高度?它可以请求可能可见的一行,计算高度,然后移动到下一行等等。
    猜你喜欢
    • 1970-01-01
    • 2014-01-15
    • 1970-01-01
    • 2011-05-01
    • 1970-01-01
    • 2020-06-26
    • 2012-10-11
    • 1970-01-01
    • 2012-10-22
    相关资源
    最近更新 更多