ios - 尝试滑动弹出当前 viewController 时的确认提示
问题描述
在执行弹出操作之前,我必须确保用户知道他将丢失编辑视图控制器中的修改。为此,我正在创建一个闭包,如果弹出应该继续还是应该被阻止,它将返回与决定相对应的真/假。
问题是当用手势滑动弹出我遇到意外的行为:viewWillDisappear 被调用,但控制器没有消失。viewDidDisappear 永远不会被调用。此外,屏幕被冻结,但我可以按 tabBar 项目在另一个控制器中跳回。回到当前选项卡项时,视图控制器已经弹出,但最终,我会遇到其他冻结。
你能看到任何解决方案吗?谢谢!
// 来自自定义导航控制器的代码
var popHandler: (() -> Bool)?
override func popViewController(animated: Bool) -> UIViewController?
{
guard self.popHandler?() != false else
{
return nil
}
self.popHandler = nil
return super.popViewController(animated: animated)
}
//来自编辑控制器的代码
func setupPopHandler() {
guard let navigationController = self.navigationController as? MyCustomNavController else {
return
}
navigationController.popHandler = { [weak self] in
guard let self = self else { return true }
if self.hasChangedFields() && self.hasUnsavedWork == true {
let alert = UIAlertController(title: "Info", message: "You have unsaved changes", preferredStyle: .alert)
alert.addAction(UIAlertAction(title: "Save", style: .default, handler: { action in
// Call save method which will pop the VC after saving
}))
alert.addAction(UIAlertAction(title: "Dismiss", style: .cancel, handler: { action in
self.hasUnsavedWork = false
self.navigationController?.popViewController(animated: true)
}))
self.present(alert, animated: true)
return false
} else {
return true
}
}
}
解决方案
推荐阅读
- java - 在 for 循环中转换成绩
- android - Android导航项目不显示片段
- google-cloud-platform - 在 GCP 上将服务帐号添加到 Cloud Function
- android - 膨胀类 com.google.vrtoolkit.cardboard.CardboardView 时出错使应用程序崩溃
- azure-ad-b2c - 没有用户的 Azure B2C 身份验证
- python - docker-compose run 成功时 docker-compose up 失败
- python - 用于文本分类的一个巨大或多个小型模型
- eclipse-plugin - 以编程方式停用所有 Codan Checkers
- java - Rapidclipse - 一个屏幕中的多个窗口使用过滤器进行选择
- python - 分级机未正确计算输出