【问题标题】:Load custom UITableViewCell from Storyboard从 Storyboard 加载自定义 UITableViewCell
【发布时间】:2014-05-18 22:55:35
【问题描述】:

目前我正在使用带有情节提要的自动布局来动态调整自定义UITableViewCell 的大小。除了滚动时出现内存泄漏之外,一切正常。

我知道问题出在调用

[self.tableView dequeueReusableCellWithIdentifier:CellIdentifier];

从内部

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

我的问题是,创建参考单元格的最佳方法是什么?如何在没有dequeueReusableCellWithIdentifier 的情况下从情节提要加载单元格?

可以从viewDidLoad 调用dequeueReusableCellWithIdentifier 并创建一个引用单元格作为属性吗?

我需要参考单元来调整大小。

感谢您的帮助。

【问题讨论】:

    标签: ios uitableview autolayout heightforrowatindexpath


    【解决方案1】:

    关于如何创建参考单元格(参见原始问题),我可以看到有几个选项:

    1. 使用 XIB 创建自定义单元格,这里有很棒的文章 -> a link

      • @smileyborg 向我指出了这一点,谢谢!
    2. 在代码中创建您的自定义单元格以及约束。

    3. 在情节提要中创建您的自定义单元作为原型单元

      • 之后有 2 个选项:
        • 将自定义单元格从表格视图拖放到情节提要场景中,作为顶级 nib 对象(不是视图层次结构的一部分),然后简单地为其创建出口。
        • 复制自定义单元格并将其粘贴到情节提要场景中。使用这种方式时,无需将原始单元格注册到表中以进行出队。
        • 这两种方法的小问题是,一旦将自定义单元格拖放到情节提要场景中,您将无法直观地看到它并安排 UI。
      • 这里有很棒的文章 -> a link!

    感谢大家的帮助!

    【讨论】:

      【解决方案2】:

      是否可以从 viewDidLoad 调用 dequeueReusableCellWithIdentifier 并创建一个参考单元格作为属性?

      是的,您可以这样做。或者懒惰初始化属性:

      - (UITableViewCell *)referenceCell
      {
          if (!_referenceCell) {
              _referenceCell = [self.tableView dequeueReusableCellWithIdentifier:@"Cell"];
          }
          return _referenceCell;
      }
      

      【讨论】:

      • 这似乎也会造成泄漏。我现在正在测试它。
      • 昨晚,我与 Tyler Fox (@smileyborg) 进行了一次交谈,他为自动布局和动态表格视图高度创建了一个很好的示例link,他还确认在外部使用 dequeueReusableCellWithIdentifier cellForRowAtIndexPath 可能会造成泄漏。
      • 很好奇为什么@smileyborg 认为这会泄露。我的TLIndexPathTools 使用此方法自动计算单元高度,从未有人报告过泄漏。我刚刚测试了它。如果您有泄漏的情况,我想看看。
      • @TimothyMoose 确实,单元格在出列时会泄漏并且未在 cellForRowAtIndexPath 中返回。请参阅此处的讨论:github.com/caoimghgin/TableViewCellWithAutoLayout/issues/16 请注意,如果您只调用一次然后存储一个单元格以供以后使用,这可能不是问题。但是如果你这样做了很多次(或者你的视图控制器可能被频繁地创建和销毁),你会看到这些单元中的每一个都挂起,保留计数为 1,因此永远不会被释放。
      • @smileyborg 是的,我只是将每个单元 ID 出列并重用它。我将它们保存在字典中,它们与视图控制器一起正确出列。由于这是在常规单元重用周期之外完成的,因此我不希望它们从重用池中被丢弃。感谢您澄清您的意思。
      【解决方案3】:

      您只需将单元格出列一次并存储高度:

      - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
      {
          static NSNumber *height;
      
          if (!height) 
          {
              UITableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:@"YourCustomCell"];
              height = @(cell.bounds.size.height);
          }
      
          return [height floatValue];
      }
      

      【讨论】:

        猜你喜欢
        • 2015-07-19
        • 1970-01-01
        • 2012-09-16
        • 2016-02-03
        • 2011-12-13
        • 2014-04-12
        • 1970-01-01
        • 1970-01-01
        • 2016-03-19
        相关资源
        最近更新 更多