4

我有以下环境:

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

[navigationController setViewControllers:newControllers animated:animated];如果堆栈中的任何旧控制器都提供了模态视图控制器,那么幼稚的实现显然会失败:

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

所以一般的问题是模态控制器生命周期没有绑定到父控制器。我的问题是:

  1. 是否有管理这种层次结构和安全导航堆栈更改的标准方法?
  2. 如果不是,那么最好的自定义实现是什么?我看到了两种通用方法 - 一种是在更改导航堆栈的代码中显式关闭/取消链接所有模态控制器,另一种是向父视图控制器添加逻辑以直接管理模态控制器生命周期。
4

3 回答 3

2

没有标准方法,因为HIG不鼓励这种行为。即使在推送通知的情况下,您也不应该修改现有堆栈,除非通过推送、弹出和弹出到根目录。但是,您要问的是完全可能的。

您有多种选择,但最好的可能是通知。在您的应用程序委托中使用NSNotificationCenter以让任何感兴趣的视图控制器知道您即将弹出到您的根视图控制器。在您的每个模态视图控制器中,注册此通知名称并在收到通知时关闭您自己。关闭模式后,您可以使用popToRootViewController并避免修改堆栈的混乱。

看看 TweetBot,看看他们如何处理推送通知。我相信他们做得很好,他们只是提出了一个新的模态视图控制器。您可以做到这一点(嵌套模式演示),因此请四处试验,看看您可以做什么而不影响用户。

于 2012-04-16T11:52:03.867 回答
1

检查此方法: http: //developer.apple.com/library/ios/documentation/uikit/reference/UINavigationController_Class/Reference/Reference.html#//apple_ref/occ/instm/UINavigationController/popToRootViewControllerAnimated

此外,模态控制器是模态的有一个很好的理由 - 将用户的注意力吸引到一项任务或工作单元或您的应用程序所做的任何事情上。所以,如果你想以编程方式隐藏它并返回导航堆栈中的其他控制器,很明显你需要首先处理模态控制器。

于 2012-04-16T11:53:06.440 回答
0

调用 [self dismissModalViewControllerAnimated:YES]; 来自视图控制器的 -(void)viewDidUnload 方法。

于 2012-04-16T12:18:20.487 回答