Цикл над несколькими 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)
}
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, который показывает все сообщения с первого взгляда.