检查 UIAlertController 操作 sheet 是否通过取消按钮取消?

Check if UIAlertController action sheet is dismissed through cancel button?

我已经通过警报控制器实施了操作 sheet。我想显示一个像取消按钮这样的按钮,上面写着 "Pay" 文本。

问题是 makeCall() 单击支付按钮时函数调用,当点击屏幕的其余部分时 makeCall() 函数再次调用。

我如何识别该操作是通过支付按钮操作调用的还是通过屏幕其余部分的 Tapp 调用的?我只想在点击支付按钮时调用 makeCall() 函数。

alertController = UIAlertController(title: "", message: nil, preferredStyle: .actionSheet)    

let cancelAction = UIAlertAction(title: "Pay", style: .cancel) { (UIAlertAction) in
    printLog("cancelAction")
    makeCall()
}

cancelAction.isEnabled = false
alertController.addAction(cancelAction)

self.present(alertController, animated: true) {}

在这里,警报控制器视图 userInteraction 禁用,因此当点击外部警报控制器时不会关闭。

你可以这样做:

self.present(alertController, animated: true){
    if let mainView = alertController.view.superview?.subviews[0]{
           mainView.isUserInteractionEnabled = false
     }
}

self.present(alertController, animated: true) {
   if let allContainerView = alertController.view.superview?.subviews{
       for myview in allContainerView{
           if (myview.gestureRecognizers != nil){
                 myview.isUserInteractionEnabled = false
           }
       }
    }
 }

希望对你有用。

我没有找到任何解决方案来说明您如何识别通过支付按钮操作或通过点击屏幕其余部分调用的操作。

但改变的解决方案是你add tap gesture on rest view。因此,您可以确定是点击取消按钮还是点击屏幕的其余部分。

alertController = UIAlertController(title: "", message: nil, preferredStyle: .actionSheet)

            let cancelAction = UIAlertAction(title: "Pay", style: .cancel) { (UIAlertAction) in
                printLog("cancelAction")
                makeCall()
            }

            alertController.addAction(cancelAction)

            self.present(alertController, animated: true) {
                let tapGesture = UITapGestureRecognizer(target: self, action: #selector(self.dismissAlertController))
                alertController.view.superview?.subviews[0].addGestureRecognizer(tapGesture)
            }


@objc func dismissAlertController(){
        self.dismiss(animated: true, completion: nil)
        print("through Tap on rest of the screen")
    }