我希望在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,因为前一个视图未被删除 - 只是隐藏。
我需要在隐藏此视图(即不可见)时处理代码,更重要的是,当代码再次可见时处理代码。
答案 0 :(得分: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
}
}
答案 1 :(得分:1)
如果演示文稿样式设置为UIViewController
,则在呈现UIModalPresentationOverCurrentContext
时,它不会调用viewWillDisappear
及相关方法,因为视图永远不会消失或被隐藏。
一个简单的测试,用于检查是否会将您使用的NavController设置为具有清晰的背景颜色。如果你这样做并呈现NavController,你仍然可以在NavController内容下面查看第一个UIViewController。然后您正在使用UIModalPresentationOverCurrentContext
,这就是为什么不调用viewDidDisappear
的原因。
看看Serghei Catraniuc(https://stackoverflow.com/a/30787112/4539192)引用的答案。
答案 2 :(得分:0)
首先,感谢Serghei有时间帮助完成这项工作。
为了澄清,我的潜在控制器都在故事板中设置为全屏演示风格,但是有一个是通过一段处理演示文稿的粘贴代码设置为Custom。我找不到另一个错误。
但是,如果我强制使用全屏幕的演示风格作为演示过程的一部分,那么一切都还可以。
希望我令人沮丧的下午可以帮助拯救别人 - 总是试着去理解粘贴片段中涉及的含义和过程。