【问题标题】:How to update custom header views in a UITableView when sections are deleted?删除部分时如何更新 UITableView 中的自定义标题视图?
【发布时间】:2011-04-25 14:08:22
【问题描述】:

我有一个多节 UITableView,其中包含需要知道其节索引的自定义标题视图。我目前在 viewForHeaderInSection 中创建自定义视图时,在 UIView 的 tag 字段中记录了节号。但是,当删除一行时,UITableView 不会为屏幕上可见的标题视图重新加载节标题视图,因此它们的标签字段变得不同步。在表上调用 reloadData 通过重新创建标题视图来重新同步标记字段,但调用 reloadData 会干扰行删除动画。如果用户在计时器触发之前最终与不同步的标头进行交互,那么设置一个计时器以在“短”时间后调用 reloadData 似乎很棘手并且有些风险(我想我可以添加一个状态变量来防止这种情况,呃)。

我可以假设跟踪容器中创建的所有标题视图,并在删除行时调整它们的标签(再次)。但是,我该如何避免泄露视图呢?我如何知道 UITableView 何时发布了视图,以便我可以删除对它们的引用以便释放它们?

这似乎比应该做的工作多得多……我错过了什么吗?我注意到其他人也有非常相似的问题,但从未见过明确的解决方法。

【问题讨论】:

    标签: iphone uitableview


    【解决方案1】:

    我有一个多节 UITableView,其中包含需要知道其节索引的自定义标题视图。我目前在viewForHeaderInSection中创建自定义视图时,在UIView的tag字段中记录了节号。

    控制器拥有的字​​典如何记录每个视图的每个部分编号。由于您记录的部分编号取决于表格视图,因此您必须等待它刷新(您不必经常自己调用。)

    您只需要找到/制作一种方法来为每个视图设置键,这样无论顺序如何,您都可以知道哪个是哪个。

    如果用户在计时器触发之前最终与不同步的标头进行交互,那么设置一个计时器以在“短”时间后调用 reloadData 似乎有些棘手并且有些风险(我想我可以添加一个状态变量为了防止这种情况,呃)。

    我同意这看起来很老套,很好的直觉。添加一个状态变量来防止这种情况比为每个视图添加一个字典和跟踪系统要少,但我认为它也属于“hacky解决方案”。

    【讨论】:

    • 对,我可以跟踪标题视图,正如我在问题中指出的那样,但我问:如何避免泄漏它们?何时使用自定义页眉/页脚视图“完成”表格视图?如果我保留对标题视图的引用(例如,在字典中)以便更新它们的标签,我怎么知道何时释放它们? p.s.使用带有状态变量的延迟重新加载来防止视图的不同步使用非常简单,并且可以保留部分删除动画。但我仍然想知道如何“正确”地做到这一点,并想知道什么时候可以从我的字典中释放视图。
    • 当部分中的所有行都消失时,页眉和页脚也应该消失。问题是你必须对多个部分都很聪明,关于哪个是哪个,小心并使用某种检查你在正确的索引处有正确的视图来删除。
    • 在某个部分滚动离开屏幕时,UITableView 将释放该部分的自定义视图。我想知道什么时候会发生。那可能吗?否则,我必须永远保留所有自定义标题视图,直到表格被销毁。这就是我试图避免的。
    • 当 viewDidDisappear 被调用时。
    • "通知视图控制器其视图已被解除、覆盖或以其他方式从视图中隐藏。- (void)viewDidDisappear:(BOOL)animated" 对于每个部分标题视图,单独进行。
    【解决方案2】:

    您不需要重新加载表格;只需更新标签属性。在您删除行的代码中;您可以访问标题视图吗?如果没有,您可以使用观察模式在删除行时提醒标题视图。

    【讨论】:

    • 我知道我可以跟踪标题视图(正如我在问题中指出的那样),但是如何避免泄露它们?
    猜你喜欢
    • 1970-01-01
    • 2013-11-26
    • 1970-01-01
    • 1970-01-01
    • 2013-03-14
    • 2023-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多