如何在任何时候(甚至在转换期间)或解除视图控制器安全时解除视图控制器?

Nic*_*eld 5 objective-c uiviewcontroller uikit ios

我有一个与服务器连接的iOS应用程序.如果我们断开连接,我希望能够关闭顶视图控制器以返回到"连接到服务器"视图控制器.问题是可能在任何时候发生断开连接,包括在视图控制器之间的转换期间.

视图控制器层次结构如下:

  1. ConnectingToServerViewController
  2. SignInViewController
  3. MainAppViewController
  4. 其他视图控制器

检测到断开连接时,我希望视图层次结构折叠回:

  1. ConnectingToServerViewController

因此,当检测到断开连接时,调用此方法ConnectingToServerViewController以解除它所呈现的任何内容并返回尝试连接到服务器:

- (void)restartSession
{
    if (self.presentedViewController) {
        [self dismissViewControllerAnimated:NO completion:nil];
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,如果我在视图转换发生时尝试关闭,我会收到诸如此类的错误

*** 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>
Run Code Online (Sandbox Code Playgroud)

第一个将崩溃应用程序,第二个将不会解雇任何东西,并继续显示当前显示的视图控制器.

思考:

  1. 由于我们不知道何时开始延迟,延误将无效
  2. 有没有办法跟踪视图转换何时完成?
  3. 应该所有视图控制器覆盖willAppear,didAppear并在可以安全解除时提醒应用程序?
  4. 或许不是解雇,我应该设置一个新的根视图控制器?
  5. 我确保所有重写的视图(将| do)(dis)?出现方法调用适当的超级方法.
  6. 任何需要所有视图控制器覆盖视图(did | will)的解决方案都会出现跟踪状态声音的方法,因为如果我们忘记为新的视图控制器设置基类,它可能会导致问题.

Jam*_*mie 0

当视图控制器当前不在屏幕上时,您似乎试图关闭它。要检查它是否在屏幕上,您可以使用:

if (self.presentedViewController.view.window) 
{
    [self dismissViewControllerAnimated:NO completion:nil];
}
else 
{
    self.presentedViewController = nil;
}
Run Code Online (Sandbox Code Playgroud)