1

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

我不能使用 ViewWillDisappear 等,因为从技术上讲,控制器从来没有从堆栈中解散——你只是看不到它。

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

编辑:这里似乎有些混乱 - 不知道为什么。我有一个视图控制器。我使用下面的代码来展示另一个控制器

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,因为前一个视图没有被删除 - 只是隐藏。

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

4

3 回答 3

1

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

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

看看 Serghei Catraniuc ( https://stackoverflow.com/a/30787112/4539192 ) 引用的答案。

于 2016-11-04T17:39:37.827 回答
1

编辑:这是在 Swift 3 中,如果您使用的是旧版本的 Swift,您可以相应地调整您的方法

如果您无法弄清楚原因viewDidAppear并且viewDidDisappear没有被调用,这里有一个解决方法

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
    }
}
于 2016-11-04T13:59:51.420 回答
0

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

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

但是,如果我在演示过程中强制使用全屏演示样式,那么一切正常。

希望我令人沮丧的下午可以帮助挽救别人的 - 始终尝试了解粘贴片段所涉及的含义和过程。

于 2016-11-04T16:27:23.343 回答