【问题标题】:Loop over multiple UIAlertController's循环多个 UIAlertController
【发布时间】:2015-03-11 21:04:51
【问题描述】:

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

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)
}

【问题讨论】:

    标签: swift synchronization uialertcontroller


    【解决方案1】:

    你快到了。拥有警报消息缓冲区是正确的想法。但是,您应该将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")
        }
    }
    

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

    【讨论】:

    • 这正是我想要的。谢谢!确实,我非常接近:) 你是对的,它确实有点混乱。我会研究那个选项。听起来是一个好主意。再次感谢!
    猜你喜欢
    • 1970-01-01
    • 2017-11-02
    • 2018-11-06
    • 2017-01-15
    • 2015-03-10
    • 2014-05-22
    • 2011-08-09
    • 1970-01-01
    相关资源
    最近更新 更多