Перебрать несколько 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)
}

person fisher    schedule 11.03.2015    source источник


Ответы (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")
    }
}

Совет: закрытие нескольких предупреждений очень раздражает. Возможно, вы могли бы создать специальный полноэкранный viewController, который показывает все сообщения об ошибках в UITableView или что-то в этом роде. Это, конечно, зависит от количества предупреждающих сообщений, которые увидит обычный пользователь. Если их регулярно больше трех, я бы использовал модальный UIViewController, который сразу показывает все сообщения.

person Matthias Bauch    schedule 11.03.2015
comment
Это было именно то, что я искал. Благодарю вас! Я был довольно близок, действительно :) Вы правы, это немного загромождает. Я рассмотрю этот вариант. Звучит как хорошая идея. Спасибо еще раз! - person fisher; 12.03.2015