当 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
的旧版本,您可以相应地调整您的方法
如果您无法弄清楚为什么 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
}
}
首先,感谢 Serghei 花时间帮助解决这个问题。
澄清一下,我的两个潜在呈现控制器在故事板中都设置为全屏呈现样式,但是通过一段处理呈现的粘贴代码将一个控制器设置为自定义。我找不到另一个错误。
但是,如果我在呈现过程中强制使用全屏呈现风格,则一切正常。
希望我这个令人沮丧的下午可以帮助拯救其他人的 - 始终尝试理解粘贴片段中涉及的含义和过程。
在呈现 UIViewController
时,如果呈现样式已设置为 UIModalPresentationOverCurrentContext
,则它不会调用 viewWillDisappear
和相关方法,因为视图永远不会消失或隐藏。
检查是否属于这种情况的一个简单测试是将您正在使用的 NavController 设置为具有清晰的背景颜色。如果您这样做并显示 NavController,您仍然可以在 NavController 内容下方查看第一个 UIViewController。然后你正在使用 UIModalPresentationOverCurrentContext
,这就是 viewDidDisappear
没有被调用的原因。
看看 Serghei Catraniuc () 引用的答案。
我想在 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
的旧版本,您可以相应地调整您的方法如果您无法弄清楚为什么 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
}
}
首先,感谢 Serghei 花时间帮助解决这个问题。
澄清一下,我的两个潜在呈现控制器在故事板中都设置为全屏呈现样式,但是通过一段处理呈现的粘贴代码将一个控制器设置为自定义。我找不到另一个错误。
但是,如果我在呈现过程中强制使用全屏呈现风格,则一切正常。
希望我这个令人沮丧的下午可以帮助拯救其他人的 - 始终尝试理解粘贴片段中涉及的含义和过程。
在呈现 UIViewController
时,如果呈现样式已设置为 UIModalPresentationOverCurrentContext
,则它不会调用 viewWillDisappear
和相关方法,因为视图永远不会消失或隐藏。
检查是否属于这种情况的一个简单测试是将您正在使用的 NavController 设置为具有清晰的背景颜色。如果您这样做并显示 NavController,您仍然可以在 NavController 内容下方查看第一个 UIViewController。然后你正在使用 UIModalPresentationOverCurrentContext
,这就是 viewDidDisappear
没有被调用的原因。
看看 Serghei Catraniuc (