我有以下环境:
- Root View Controller 是 UINavigationController
- 许多自定义 UIViewControllers 可能会被推送到导航堆栈上
- 每个自定义 Controller 可能会或可能不会呈现模态视图 Controller
- 我需要能够以编程方式管理导航堆栈(例如 - 从导航堆栈中删除除根 Controller 之外的所有 Controller ,作为对某些外部事件(如推送通知传递)的响应)
使用 [navigationController setViewControllers:newControllers animated:animated];
的简单实现显然会失败,如果堆栈中有任何旧 Controller 提供的模态视图 Controller :
- 这个模态 Controller 保持可见
- 如果委托(delegate)模式用于父<->模态 Controller 通信(父是呈现模态视图 Controller 的委托(delegate)),模态视图 Controller 中的任何操作都会导致崩溃,因为委托(delegate)已被释放
所以普遍的问题是,modal controller lifcycle 没有绑定(bind)父 Controller 。我的问题是:
- 是否有管理此类层次结构和安全导航堆栈更改的标准方法?
- 如果不是,那么最好的自定义实现是什么?我看到了两种通用方法 - 一种是在更改导航堆栈的代码中显式关闭/取消链接所有模态 Controller ,另一种是向父 View Controller 添加逻辑以直接管理模态 Controller 生命周期。
最佳答案
没有标准方法,因为 HIG 不鼓励这种行为.即使在推送通知的情况下,您也不应该修改现有堆栈,除非通过推送、弹出和弹出到根目录。但是,您所问的是完全可能的。
您有多种选择,但最好的可能是通知。在您的应用委托(delegate)中使用 NSNotificationCenter
让任何感兴趣的 View Controller 知道您即将弹出到您的 Root View Controller 。在您的每个模态视图 Controller 中,注册此通知名称并在收到通知时自行解雇。关闭模态框后,您只需使用 popToRootViewController
即可避免修改堆栈造成的困惑。
看看 TweetBot,了解它们如何处理推送通知。我相信他们做得很好,他们只是展示了一个新的模态视图 Controller 。您可以这样做(嵌套模式演示),因此请多多试验,看看您可以在不影响用户的情况下做些什么。
关于ios - 使用模态视图 Controller 修改 UINavigationController 堆栈,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10173442/