【问题标题】:How can I store a cell height value in a Realm object that is associated with the cell?如何将单元格高度值存储在与单元格关联的领域对象中?
【发布时间】:2016-07-28 11:14:45
【问题描述】:

我在 iOS 上使用 Realm Swift 来存储与 UITableViewCell 关联的对象。每个单元格都有一个动态高度,我也想将该高度信息存储在 Realm 对象中。 但不幸的是,我无法将更新单元格高度信息的代码放在 Realm 对象的通知块中,因为它会触发无限循环。我尝试将它添加到另一个类中,该类与基对象创建某种外键关系,并且当我尝试更新通知块中的另一个对象时,它也以某种方式触发了无限循环。

解决这个问题的最佳方法是什么?

【问题讨论】:

    标签: swift uitableview realm


    【解决方案1】:

    与 Cocoa 的 Key Value Observing 非常相似,Realm 的通知表明,如果您在对象上设置了任何属性,则该对象已被修改,即使您将属性设置为其现有值也是如此。这很可能是触发您的通知循环的原因。为避免这种情况,您可以在通知块中检查是否将单元格高度属性设置为与对象已有的值相同的值。如果是这样,请跳过更新属性。

    【讨论】:

    • 我的问题是对象正在更新,因此我需要重新计算高度,这意味着我需要在 addNotificationBlock 中更新同一对象中的高度属性的值,这将触发无限循环。
    • 我不知道你为什么认为这会产生一个 infinite 循环。更新 height 属性将触发另一个通知,但第二次调用通知块时,您对高度的计算应该给出相同的结果,因为对象的其他属性没有更改。检测到您计算了相同的结果并跳过设置 height 属性将导致通知块的额外调用一次。
    • 在 addNotificationBlock 中,我执行领域写入以将高度设置为 0 以使其无效。然后在单元格布局代码中,我执行realm write将高度设置为正确的值,这将触发addNotificationBlock代码再次运行,我需要再次将高度设置为0,以此类推...跨度>
    • 所以你在通知块中invalidating单元格高度,当你稍后重新计算它时,你会触发一个导致循环的新通知,而不是简单地更新它如您在问题中所述,在通知块内。这让我想知道为什么单元格高度是你甚至存储在领域中的东西。为什么还要把它保存到磁盘呢?
    • realm 对象中其他属性的变化会触发高度变化,我让 Apple 在失效后重新计算高度。如果高度不为零,则在估计高度强制路径函数期间使用高度。 IMO,无论如何都可以在单元格布局后一直更新高度值,因为它不会触发完整计算,它只是存储值。但在这种情况下,它会触发无限循环。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-03
    • 2013-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-09
    相关资源
    最近更新 更多