【问题标题】:Is it possible to block execution of my code until UIAlertController is dismissed?是否可以阻止我的代码执行,直到 UIAlertController 被解除?
【发布时间】:2017-03-24 03:01:57
【问题描述】:

是否有等待用户通过使用 DispatchQueue 或其他方式在 swift 3 中按下关闭 alertController 的按钮?

【问题讨论】:

  • 是的,我知道,但我的意思是,在我提出警报控制器之后,是否有等待(让我的代码不执行任何操作)直到用户关闭警报?
  • 如果您想停止执行代码直到用户关闭警报,然后将您的执行代码添加到 UIAlertAction 的处理程序部分。
  • @NiravD 实际上,我在警报中添加了一个普通按钮以将其关闭,那么我如何添加处理程序以停止执行我的代码,直到用户按下此按钮?
  • 将您想要稍后执行的所有代码放在该操作处理程序上。

标签: ios swift uialertcontroller


【解决方案1】:

只需将警报解除后要执行的所有代码移动到单独的方法中即可。添加UIAlertActions 时,使所有操作的handler 参数调用该方法。这样,无论用户按下哪个按钮,你的代码都会被执行!

【讨论】:

    【解决方案2】:

    你的意思是这样的?

    alertController.displayAndWaitUntilDismissed()
    // This line is only reached after the alert controller is dismissed
    print("Alert controller dismissed.")
    

    理论上,是的,您可以使用调度信号量来阻止,直到警报被解除。但这是个坏主意——我什至想不出一个可以接受的场景。只需接受您必须通过在警报控制器操作中执行所需代码来异步处理它。

    【讨论】:

      【解决方案3】:

      您不得阻塞主线程并等待解除警报,因此唯一的方法是异步执行此操作。

      例如,您可以使用 UIViewControllerTransitioningDelegate 的下一个常用方法:

      fileprivate var AssociatedObjectKey: UInt8 = 0
      
      extension UIAlertController : UIViewControllerTransitioningDelegate {
          
          var onDissmiss: (() -> Void)? {
              set {
                  transitioningDelegate = newValue != nil ? self : nil
                  objc_setAssociatedObject(self, &AssociatedObjectKey, newValue, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN_NONATOMIC)
              }
              get {
                  return objc_getAssociatedObject(self, &AssociatedObjectKey) as? (() -> Void)
              }
          }
      
          
          public func animationController(forDismissed dismissed: UIViewController) -> UIViewControllerAnimatedTransitioning? {
              onDissmiss?()
              return nil
          }
      }
      

      使用方法:

      let alert = UIAlertController(title: "Title", message: "Message", preferredStyle: .alert)
      
      let ok = UIAlertAction(title: "OK", style: .default)
      alert.addAction(ok)
      
      alert.onDissmiss = {
          print("dissmiss")
      }
      
      present(alert, animated: true)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-06-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-09-05
        相关资源
        最近更新 更多