刷新 UINavigationController 中的“根”数据并更新导航堆栈中的数据

Posted

技术标签:

【中文标题】刷新 UINavigationController 中的“根”数据并更新导航堆栈中的数据【英文标题】:Refresh "root" data inside a UINavigationController and update data in navigation stack 【发布时间】:2016-12-09 21:08:20 【问题描述】:

我正在使用带有视图控制器 A、B 和 C 的 UINavigationController 的故事板。

A 是导航控制器的根视图控制器,它在启动时获取一些数据。如果我单击 A 中的一行,它将使用该数据转到 B 视图控制器。单击 B 中的一行将转到 C 视图控制器。

稍后在我的应用程序中,例如我在 C 中,用户想要刷新数据。这意味着我需要再次获取 A 视图控制器的根数据。

如何在用户刷新数据后再次重建我的导航层次结构?我需要在 A 中更新数据源,然后在 B 中,最后在 C 中以某种方式更新。

【问题讨论】:

你不能简单地刷新在 C 中显示的数据吗?还是真的要刷新整个根目录? 所有数据都应该更新,否则会处于不一致的状态 【参考方案1】:

这只是提前计划的问题,不是吗?这是你的计划,所以你的工作是为你自己提供需要的设施。在这种情况下,没有必要“重建”任何东西(尽管你可以这样做,我想)。即使在您展示 C 时,A 和 B 仍然存在,因此您所要做的就是根据需要与他们沟通。如果数据获取能力只存在于 A 中,那么只需为 A 提供一个 C 可以调用的方法,以便请求刷新并接收更新的数据。如果 A 和 B 随后再次显示(因为用户从 C 中弹回),他们当然也会使用他们的viewWillAppear 来更新他们各自的界面。但目前 A 和 B 只是对象,对象之间的通信毕竟是面向对象编程的全部内容。

【讨论】:

井 A “容纳”了获取的数据。 B 显示 A 数据的子集,C 显示 B 数据的子集。我在想,在我再次完成提取后,我需要更新 A、B 和 C 中的数据属性吗?这意味着我需要获取对导航控制器的引用并访问它的视图控制器属性以访问导航堆栈并更新数据是视图控制器对吗? 这当然是一种方法,正如我在这里描述的那样:***.com/a/40986685/341994 但还有其他方法,也许更好。例如,您可以传递对 A 的引用,从 A 传递到 B,然后从 B 传递到 C。或者,更进一步,您可以传递从 A 到 B 的 对数据的引用,然后然后从 B 到 C,可能包装在一个帮助对象中,该对象具有如何进行刷新的知识。这就是 会做的事情。 Apple 将这种模式称为“依赖注入”:为每个连续的视图控制器提供它所需要的一切。【参考方案2】:

您应该将 A 的所有逻辑放在另一个可以从 A 和 C 访问的对象中。 我认为这个post 是一个很好的起点

【讨论】:

以上是关于刷新 UINavigationController 中的“根”数据并更新导航堆栈中的数据的主要内容,如果未能解决你的问题,请参考以下文章

UIRefreshControl - 当UITableViewController在UINavigationController中时,beginRefreshing无效

iOS 从某个页面返回然后刷新当前页面

类似刷新微博后,顶部显示更新数量的动画。

iOS:如何在弹出其子 UIViewController 后“刷新” UIViewController?

在导航栏中按下后退按钮时刷新 RootViewController 的内容

关闭 UINavigationController 并呈现另一个 UINavigationController