我有一个连接到服务器的iOS应用程序。如果我们断开连接,我想能够关闭顶层视图控制器以返回到“连接到服务器”视图控制器。问题是,断开连接可能发生在任何时间,包括在视图控制器之间的转换期间。
视图控制器层次结构如下:
1. 连接到服务器视图控制器(ConnectingToServerViewController) 2. 登录视图控制器(SignInViewController) 3. 主要应用程序视图控制器(MainAppViewController) 4. 其他视图控制器
当检测到断开连接时,我希望视图层次结构会折叠回去,变为:
1. 连接到服务器视图控制器(ConnectingToServerViewController)
因此,在检测到连接中断时,将调用此方法来关闭
```swift func resetViewHierarchy() { dismiss(animated: true, completion: nil) navigationController?.popViewController(animated: true) } ```
然而,如果我在视图转换过程中尝试关闭应用程序,则会出现错误,例如:
视图控制器层次结构如下:
1. 连接到服务器视图控制器(ConnectingToServerViewController) 2. 登录视图控制器(SignInViewController) 3. 主要应用程序视图控制器(MainAppViewController) 4. 其他视图控制器
当检测到断开连接时,我希望视图层次结构会折叠回去,变为:
1. 连接到服务器视图控制器(ConnectingToServerViewController)
因此,在检测到连接中断时,将调用此方法来关闭
ConnectingToServerViewController
已经呈现的任何内容,并返回尝试连接到服务器:```swift func resetViewHierarchy() { dismiss(animated: true, completion: nil) navigationController?.popViewController(animated: true) } ```
- (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方法都调用了适当的super方法。
- 任何需要所有视图控制器覆盖view(did|will)appear方法来跟踪状态的解决方案听起来都可能会引起问题,如果我们忘记为新视图控制器设置基类。