在返回ViewController之前显示UIAlertController

时间:2019-06-24 18:55:18

标签: ios swift xcode

我有3个视图控制器

第一个RestaurantsViewController

第二个CategoryViewController

CartviewController的三分之一

CartviewController中,我已将CartviewController的所有项目的计数存储在UserDefault中  现在,在CategoryViewController中,如果用户单击导航控制器中的“后退”项目,则他们应查看RestaurantsViewController 但在此之前,我需要在显示之前先显示UIAlertController RestaurantsViewController

我使用

 override func willMove(toParent parent: UIViewController?)
    {
        super.willMove(toParent: parent)
        if parent == nil
        {
            if UserDefaults.standard.integer(forKey: "arrayFoodSize") > 0 
          && UserDefaults.standard.integer(forKey: "arrayFoodSize") != 0 {

                let alert = UIAlertController(title: "delete all item ?", message: "delete all item !?", 
           preferredStyle: .alert)

                alert.addAction(UIAlertAction(title: "yes", style: 
         .destructive, handler: { (UIAlertAction) in
                    let realm = try! Realm()
                    try! realm.write {
                        realm.deleteAll()
                    }

                    let lvc = 
            self.storyboard?.instantiateViewController(withIdentifier: 
           "res_vc") as! 
          NavigationViewController


                    let appDelegate =  UIApplication.shared.delegate as! 
               AppDelegate
                    appDelegate.window?.rootViewController = lvc
               nil)

                }))
                alert.addAction(UIAlertAction(title: "no", style: .cancel, 
            handler: nil))

                self.present(alert, animated: true)

            }

        }

最后,如果UIAlertAction的结果为“是” 我需要显示RestaurantsViewController

及其代码结果(如上所示)显示RestaurantsViewControllerUIAlertController 以及我需要什么,当我在UIAlertController时先显示CategoryViewController,然后再显示RestaurantsViewController

1 个答案:

答案 0 :(得分:-1)

似乎没有本机的方法来拦截导航控制器的后退按钮的动作。 如果要拦截该操作,请显示警报,然后决定是否关闭视图控制器,我建议您使用自定义的后退按钮。

类似的东西:

 override func viewDidLoad {
        super.viewDidLoad()
        self.navigationItem.hidesBackButton = true
        let newBackButton = UIBarButtonItem(title: "Back", style: UIBarButtonItemStyle.plain, target: self, action: #selector(YourViewController.back(sender:)))
        self.navigationItem.leftBarButtonItem = newBackButton
    }

    func back(sender: UIBarButtonItem) {
        // Show alert here
    }

然后,处理是否在警报中关闭当前视图的逻辑。

问题:用户仍然可以使用交换手势返回。

解决方案可能是:

// in viewDidLoad, set interactivePopGestureRecognizerDelegate as self
self.navigationController.interactivePopGestureRecognizer.delegate = self

然后,实现gestureRecognizerShouldBegin:方法,返回 FALSE 以禁用该viewController中的手势,或者如果要保留该手势,则返回 TRUE ,但是您需要处理对应的逻辑。

gestureRecognizerShouldBegin:的文档

https://developer.apple.com/documentation/uikit/uigesturerecognizerdelegate/1624213-gesturerecognizershouldbegin