如何使用警报来确认或取消视图转换?

时间:2018-09-25 09:12:02

标签: ios swift uialertcontroller uialertaction

在某些情况下,如果用户打算离开当前视图(例如,弹出当前视图,推入其他视图或选择其他选项卡项等),则应显示UIAlertController以确认用户的真实意图。

用户可以按OK进行视图转换,或按Cancel保留当前视图。

field.removeSelectOption({
value: null,
});

任何可以满足该要求的解决方案吗?

2 个答案:

答案 0 :(得分:3)

首先,您不能处理viewWillDisappear,因为此时已经确定视图将消失。只要您有视图转换(推,弹出,呈现,关闭),就需要进行处理。

您必须处理确认警报操作中的过渡。您的警报看起来像这样。

let alert = UIAlertController(title: "Wait!", message: "Are you sure you want to leave this view?", preferredStyle: .alert)
let ok = UIAlertAction(title: "OK", style: .default) { (alertAction) in
    //Handle view transitioning here
}
let cancel = UIAlertAction(title: "Cancel", style: .destructive) { (alertAction) in
    //Do nothing?
}
alert.addAction(ok)
alert.addAction(cancel)
present(alert, animated: true, completion: nil)

答案 1 :(得分:0)

一旦触发ViewController,您将无法在同一viewWillDissaper中拦截并保留用户。你应该提前做。我的建议是在标签UIBarButton上添加一个navigationItem.leftBarButtonItem,并手动检查用户是否要导航。这是您可以获得的最接近的东西。

此外,您可以使用UIAlertViewController来确认用户是否要导航。

    //inside viewDidLoad
    navigationItem.leftBarButtonItem = UIBarButtonItem(title: "Back", style: .plain, target: self, action: #selector(handleBack))

    //define another function to handle the selctor
    @objc func handleCancel(){
       if someConditions {
                promptUIAlert()
        }
    }

    //you function should be like this with UIAlertController
    func promptUIAlert(){
        let alertController = UIAlertController(title: "Error", message: "Some message", preferredStyle: .alert)
        let CancelAction = UIAlertAction(title: "Cancel", style: .default) { (action) in
         //type your custom code here for cancel action
        }
let OkAction = UIAlertAction(title: "OK", style: .default) { (action) in
         //type your custom code here for OK action
        }
        alertController.addAction(OKAction)
        alertController.addAction(CancelAction)

        self.present(alertController, animated: true)
    }

viewWillDissaper内部执行操作会很方便,以将一些未保存的数据保存在屏幕后面。但不要提示并询问用户是否要保留在同一ViewController中。