ios - 使用模态视图 Controller 修改 UINavigationController 堆栈

标签 ios uinavigationcontroller modalviewcontroller presentmodalviewcontroller

我有以下环境:

  • Root View Controller 是 UINavigationController
  • 许多自定义 UIViewControllers 可能会被推送到导航堆栈上
  • 每个自定义 Controller 可能会或可能不会呈现模态视图 Controller
  • 我需要能够以编程方式管理导航堆栈(例如 - 从导航堆栈中删除除根 Controller 之外的所有 Controller ,作为对某些外部事件(如推送通知传递)的响应)

使用 [navigationController setViewControllers:newControllers animated:animated]; 的简单实现显然会失败,如果堆栈中有任何旧 Controller 提供的模态视图 Controller :

  1. 这个模态 Controller 保持可见
  2. 如果委托(delegate)模式用于父<->模态 Controller 通信(父是呈现模态视图 Controller 的委托(delegate)),模态视图 Controller 中的任何操作都会导致崩溃,因为委托(delegate)已被释放

所以普遍的问题是,modal controller lifcycle 没有绑定(bind)父 Controller 。我的问题是:

  1. 是否有管理此类层次结构和安全导航堆栈更改的标准方法?
  2. 如果不是,那么最好的自定义实现是什么?我看到了两种通用方法 - 一种是在更改导航堆栈的代码中显式关闭/取消链接所有模态 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/

相关文章:

ios - 我可以收到其他应用程序通知的提醒吗

ios - 以编程方式更改 UINavigationBar 上的 UIBarButtonItem 标识符

ios - sencha touch microloader 在 iOS 中不工作

ios - 导航栏没有出现?

iphone - 用 modalview 调用 navigationcontroller?

iphone - 显示方向与设备方向不同的模态视图

ios - 如何在小时和分钟上倒数计时器并在它为 0 时停止, objective-c

iphone - 一个 Xib 文件用于 2 种状态 : showing & editing a object

ios - 如何将新的 View Controller 包含到现有的导航 View 中

iphone - 模态视图 Controller 不会自行解散