swift - 循环多个 UIAlertController

标签 swift synchronization uialertcontroller

在某些情况下,我的应用程序需要显示多个警报消息。错误消息在启动时收集,需要一次一条地显示给用户。当第一个被确认时,下一个应该被呈现。显然,问题是它们都试图同时执行。有没有一种聪明的方法可以同步执行此操作?下面是一些简单描述我想做什么的代码:

var errors : [NSError]!

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.

    let error1 = NSError(domain: "Test1", code: 1, userInfo: [NSLocalizedFailureReasonErrorKey : "Test1 reason."])

    let error2 = NSError(domain: "Test2", code: 2, userInfo: [NSLocalizedFailureReasonErrorKey : "Test2 reason."])

    let error3 = NSError(domain: "Test3", code: 2, userInfo: [NSLocalizedFailureReasonErrorKey : "Test3 reason."])

    errors = [error1, error2, error3]

}

override func viewDidAppear(animated: Bool) {
    super.viewDidAppear(animated)

    for error in errors {

        self.showAlert(error)

    }

}

func showAlert(error: NSError) {

    var alert = UIAlertController(title: error.domain, message: error.localizedDescription, preferredStyle: .Alert)
    alert.addAction(UIAlertAction(title: "OK", style: .Default, handler:nil))

    self.presentViewController(alert, animated: true, completion: nil)
}

最佳答案

你快到了。拥有警报消息缓冲区是正确的想法。但不是立即显示所有警报,您应该将 showAlert() 调用移动到 UIAlertAction 的处理程序。因此,如果解除一个警报,将显示下一个警报。

是这样的:

var errors : [NSError]!

override func viewDidAppear(animated: Bool) {
    super.viewDidAppear(animated)

    let error1 = NSError(domain: "Test1", code: 1, userInfo: [NSLocalizedFailureReasonErrorKey : "Test1 reason."])
    let error2 = NSError(domain: "Test2", code: 2, userInfo: [NSLocalizedFailureReasonErrorKey : "Test2 reason."])
    let error3 = NSError(domain: "Test3", code: 2, userInfo: [NSLocalizedFailureReasonErrorKey : "Test3 reason."])

    errors = [error1, error2, error3]

    showError() // show an alert if errors are queued
}

func showError() {
    if let error = errors.first {
        let alert = UIAlertController(title: error.domain, message: error.localizedDescription, preferredStyle: .Alert)
        let okayAction = UIAlertAction(title: "OK", style: .Default) { action in
            self.errors.removeAtIndex(0) // remove the message of the alert we have just dismissed

            self.showError() // show next alert if there are more errors queued
        }
        alert.addAction(okayAction)
        presentViewController(alert, animated: true, completion: nil)
    }
    else {
        println("All alerts shown")
    }
}

忠告:关闭多个警报非常烦人。也许你可以创建一个专用的全屏 viewController 来显示 UITableView 或其他东西中的所有错误消息。这当然取决于典型用户将看到的警报消息的数量。如果它经常超过三个,我会使用模态 UIViewController,它一目了然地显示所有消息。

关于swift - 循环多个 UIAlertController,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28997342/

相关文章:

swift - 将存储在对象中的uipickerview添加到viewcontroller的 View 中

swift - 由于 ""错误 -25204 获取元素的快照,XCUI 测试在 iOS 10 上失败但在 iOS 9 上失败”

java - 是否可以使用 volatile 变量来实现一致的只写同步?

ios - Swift 5 - 通过 UIAlertView 在文本字段中进行验证

objective-c - 从 UIView/NSObject 类显示 UIAlertController

ios - 如何从 pickerView didSelectRow 委托(delegate)方法更新警报 Controller 的 UITextField 上的文本?

json - 不显示选定的 JSON 数据

swift - 带有 UIViewController 内部按钮的 TableView

c - 使用 UNIX 管道进行进程同步-饥饿

java - 同步线程执行顺序的变化