当ViewController由呈现的ViewController

时间:2016-11-04 12:38:39

标签: ios swift2 presentviewcontroller viewwilldisappear

我希望在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,因为前一个视图未被删除 - 只是隐藏。

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

3 个答案:

答案 0 :(得分:1)

编辑:这是在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
    }
}

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:0)

首先,感谢Serghei有时间帮助完成这项工作。

为了澄清,我的潜在控制器都在故事板中设置为全屏演示风格,但是有一个是通过一段处理演示文稿的粘贴代码设置为Custom。我找不到另一个错误。

但是,如果我强制使用全屏幕的演示风格作为演示过程的一部分,那么一切都还可以。

希望我令人沮丧的下午可以帮助拯救别人 - 总是试着去理解粘贴片段中涉及的含义和过程。