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