如何让特定按钮跳转时跳过ViewController的viewDidDisappear()方法
如何让特定按钮跳转跳过viewDidDisappear逻辑
这个需求在iOS开发里挺常见的,单纯用零散的if判断虽然能解决,但确实有更优雅高效的实现方式,给你几个思路参考:
1. 封装标记位(简洁易维护)
定义一个私有布尔属性来标记是否需要跳过消失逻辑,在特殊按钮点击时设置标记,执行跳转后再重置标记避免影响后续场景:
class YourViewController: UIViewController { // 私有标记位,默认不跳过 private var shouldSkipDisappearLogic = false @IBAction func specialButtonTapped(_ sender: UIButton) { shouldSkipDisappearLogic = true // 执行跳转操作(比如push到目标页面) navigationController?.pushViewController(NextViewController(), animated: true) } override func viewDidDisappear(_ animated: Bool) { super.viewDidDisappear(animated) // 如果标记为需要跳过,直接返回并重置标记 guard !shouldSkipDisappearLogic else { shouldSkipDisappearLogic = false return } // 这里放原来视图消失时要执行的特定操作 } override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) // 每次视图重新出现时重置标记,防止异常状态 shouldSkipDisappearLogic = false } }
2. 使用枚举区分触发场景(扩展性强)
如果未来可能出现多种需要跳过或执行逻辑的场景,用枚举来标记视图消失的触发原因会更清晰:
// 定义枚举,标记视图消失的触发来源 enum DisappearTrigger { case normal // 普通场景(比如返回按钮) case specialButtonTap // 特殊按钮跳转 } class YourViewController: UIViewController { private var disappearTrigger: DisappearTrigger = .normal @IBAction func specialButtonTapped(_ sender: UIButton) { disappearTrigger = .specialButtonTap navigationController?.pushViewController(NextViewController(), animated: true) } override func viewDidDisappear(_ animated: Bool) { super.viewDidDisappear(animated) // 仅当触发来源是普通场景时,执行原有逻辑 guard disappearTrigger != .specialButtonTap else { disappearTrigger = .normal // 重置状态 return } // 原来的特定操作 } override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) disappearTrigger = .normal } }
3. 抽离消失逻辑到独立方法(彻底解耦)
把原来在viewDidDisappear里的操作抽成独立方法,只有需要执行的时候才主动调用,特殊按钮跳转时直接跳过调用:
class YourViewController: UIViewController { @IBAction func specialButtonTapped(_ sender: UIButton) { // 特殊按钮跳转:直接执行跳转,不调用消失逻辑 navigationController?.pushViewController(NextViewController(), animated: true) } // 普通场景的跳转(比如返回按钮、其他普通按钮)会触发这个方法 override func viewDidDisappear(_ animated: Bool) { super.viewDidDisappear(animated) performDisappearLogic() } // 抽离出来的消失逻辑方法 private func performDisappearLogic() { // 这里放原来视图消失时要执行的特定操作 } // 普通按钮跳转示例:先执行消失逻辑,再跳转 @IBAction func normalButtonTapped(_ sender: UIButton) { performDisappearLogic() navigationController?.pushViewController(AnotherViewController(), animated: true) } }
选择建议
- 如果只是单一特殊按钮的场景,封装标记位的方式最简洁;
- 如果未来可能扩展多种场景,枚举标记的方式更易维护;
- 如果想彻底解耦消失逻辑和生命周期方法,抽离独立方法是最佳选择。
内容的提问来源于stack exchange,提问作者user9239212
相关产品推荐
相关产品推荐

