当 ViewController 被呈现的 ViewController 覆盖时触发事件

Trigger events when ViewController covered by a presented ViewController

我想在 ViewController 由于呈现新的 ViewController 而不再可见时处理代码。

我不能使用 ViewWillDisappear 等,因为控制器在技术上从未从堆栈中消失 - 你只是看不到它。

我可以使用什么进程,以便在控制器不再可见(即最顶层)和再次可见时运行代码?

编辑: 这里似乎有些混乱 - 不确定为什么。 我有一个viewcontroller。 我使用以下代码来呈现另一个控制器

let storyboard = UIStoryboard(name: "Main", bundle: nil)
let navController = storyboard.instantiateViewControllerWithIdentifier("NavController") as! UINavigationController
let thisController = navController.viewControllers[0] as! MyController
self.presentViewController(navController, animated: true, completion: nil)

此控制器不会触发前一个控制器上的 viewWillDisappear,因为前一个视图未被删除 - 只是隐藏了。

我需要在该视图隐藏(即不可见)时处理代码,更重要的是,在它再次可见时处理代码。

编辑:这是在 Swift 3 中,如果您使用的是 Swift

的旧版本,您可以相应地调整您的方法

如果您无法弄清楚为什么 viewDidAppearviewDidDisappear 没有被调用,这里有一个解决方法

protocol MyControllerDelegate {
    func myControllerWillDismiss()
}

class MyController: UIViewController {
    var delegate: MyControllerDelegate?

// your controller logic here

    func dismiss() { // call this method when you want to dismiss your view controller

        // inform delegate on dismiss that you're about to dismiss
        delegate?.myControllerWillDismiss()
        dismiss(animated: true, completion: nil)
    }
}

class PresentingController: UIViewController, MyControllerDelegate  {
    func functionInWhichYouPresentMyController() {
        let storyboard = UIStoryboard(name: "Main", bundle: nil)
        let navController = storyboard.instantiateViewController(withIdentifier: "NavController") as! UINavigationController
        let thisController = navController.viewControllers[0] as! MyController
        thisController.delegate = self // assign self as delegate
        present(navController, animated: true, completion: {
            // place your code that you want executed when it disappears here
        })
    }

    func myControllerWillDismiss() {
        // this method will be called now when MyController will dismiss
        // place your code that you want executed when it re-appears here
    }
}

首先,感谢 Serghei 花时间帮助解决这个问题。

澄清一下,我的两个潜在呈现控制器在故事板中都设置为全屏呈现样式,但是通过一段处理呈现的粘贴代码将一个控制器设置为自定义。我找不到另一个错误。

但是,如果我在呈现过程中强制使用全屏呈现风格,则一切正常。

希望我这个令人沮丧的下午可以帮助拯救其他人的 - 始终尝试理解粘贴片段中涉及的含义和过程。

在呈现 UIViewController 时,如果呈现样式已设置为 UIModalPresentationOverCurrentContext,则它不会调用 viewWillDisappear 和相关方法,因为视图永远不会消失或隐藏。

检查是否属于这种情况的一个简单测试是将您正在使用的 NavController 设置为具有清晰的背景颜色。如果您这样做并显示 NavController,您仍然可以在 NavController 内容下方查看第一个 UIViewController。然后你正在使用 UIModalPresentationOverCurrentContext ,这就是 viewDidDisappear 没有被调用的原因。

看看 Serghei Catraniuc () 引用的答案。