使用模态视图控制器修改UINavigationController堆栈

4
我有以下环境:
- 根视图控制器是UINavigationController - 可以将许多自定义UIViewController推送到导航堆栈中 - 每个自定义控制器可能会展示一个模态视图控制器,也可能不展示 - 我需要能够通过编程方式管理导航堆栈(例如,在某些外部事件(例如推送通知传递)的响应中删除导航堆栈中除根控制器以外的所有控制器)
如果旧控制器堆栈中的任何一个控制器呈现了模态视图控制器,则使用[navigationController setViewControllers:newControllers animated:animated]; 的天真实现明显会失败:
- 此模态控制器保持可见 - 如果父<- >模态控制器通信使用委托模式(父类是呈现的模态视图控制器的代理),则模态视图控制器中的任何操作都会导致崩溃,因为代理已经被释放
因此,一般问题是模态控制器生命周期与父控制器无关。我的问题是:
- 是否有标准方法来管理这种层次结构和安全的导航栈更改? - 如果没有,则什么是最好的自定义实现?我看到两种一般方法 - 一种是在更改导航栈的代码中明确解雇/取消链接所有模态控制器,另一种是向父视图控制器添加逻辑以直接管理模态控制器的生命周期。
3个回答

2
没有标准方法,因为这种行为受到 HIG 的不鼓励。即使在推送通知的情况下,除了通过 push、pop 和 pop-to-root 操作,你也不应该修改现有栈。然而,你所询问的是完全可行的。
你有几个选择,但最好的可能是使用通知。在你的应用委托中使用 NSNotificationCenter 来让任何感兴趣的视图控制器知道你即将弹回根视图控制器。在每个模态视图控制器中,注册此通知名称并在得到通知时关闭自己。在关闭模态视图后,你可以直接使用 popToRootViewController 而无需通过修改堆栈来避免混乱。
看一下 TweetBot 是如何处理推送通知的。我相信他们做得很好,他们只是呈现一个新的模态视图控制器。你也可以这样做(嵌套模态呈现),所以尝试一下,看看你能在不刺激用户的情况下做些什么。

1

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

另外,模态控制器之所以是模态的,是有很好的原因的 - 为了吸引用户的注意力,让其专注于一个任务或工作单元或您的应用程序所做的任何事情。因此,如果您想编程隐藏它并返回到导航堆栈中的其他控制器,显然您需要先处理模态控制器。


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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接