我有一个连接到服务器的 iOS 应用程序。如果我们断开连接,我希望能够关闭顶部视图控制器以返回“连接到服务器”视图控制器。问题是任何时候都可能发生断开连接,包括在视图控制器之间的转换期间。
视图控制器层次结构是这样的:
ConnectingToServerViewController
SignInViewController
MainAppViewController
- 其他视图控制器
当检测到断开连接时,我希望视图层次结构折叠回:
ConnectingToServerViewController
因此,当检测到断开连接时,会在 上调用此方法ConnectingToServerViewController
以消除它所呈现的任何内容并返回尝试连接到服务器:
- (void)restartSession
{
if (self.presentedViewController) {
[self dismissViewControllerAnimated:NO completion:nil];
}
}
但是,如果我在视图转换发生时尝试关闭,我会收到错误,例如
*** Assertion failure in -[UIWindowController transition:fromViewController:toViewController:target:didEndSelector:], /SourceCache/UIKit/UIKit-2380.17/UIWindowController.m:211
attempt to dismiss modal view controller whose view does not currently appear. self = <YYYYYViewController: 0x2089c8a0> modalViewController = <XXXXXViewController: 0x208e6610>
attempt to dismiss modal view controller whose view does not currently appear. self = <WWWWWWViewController: 0x1fd9e990> modalViewController = <YYYYYViewController: 0x2089c8a0>
第一个将使应用程序崩溃,第二个不会关闭任何内容并继续显示当前呈现的视图控制器。
想法:
- 延迟不起作用,因为我们不知道何时开始延迟
- 有没有办法跟踪视图转换何时完成?
- 所有视图控制器都应该覆盖 willAppear、didAppear 并在可以安全关闭时提醒应用程序吗?
- 也许我应该设置一个新的根视图控制器而不是解雇?
- 我确保所有被覆盖的 view(will|did)(dis)?appear 方法都调用了适当的超级方法。
- 任何需要所有视图控制器覆盖视图(已|将)显示方法来跟踪状态的解决方案听起来都可能会导致问题,如果我们忘记为新视图控制器设置基类。