2016-06-27 2 views
1

Я попытался выполнить задачу из completion параметра present так, чтобы она выполняла желаемую функцию только после закрытия UIAlertController. Однако функция вызывалась до того, как действие было предпринято в предупреждении. Как ждать выполнения функции до тех пор, пока не будет предпринято действие?Остановить задачи до тех пор, пока не произойдет действие AlertController Swift

let alert = UIAlertController(title: "Wild Card Played", message: "Choose your suit", preferredStyle : .alert); 
for suit in suits { 
    alert.addAction(UIAlertAction(title: suit, style: .default, handler: crazyEightPlayed)) 
        } 
self.present(alert, animated: true, completion: cpuTurn) //Upon completion call the cpuTurn() function 

ответ

1

Проблема в настоящее время является то, что cpuTurn вызывается, когда предупреждение отображается пользователю, а не когда пользователь нажал «Хорошо». Как вы можете видеть в documentation here, функция завершения в методе self.present «выполнена после завершения презентации. Этот блок не имеет возвращаемого значения и не принимает никаких параметров. Вы можете указать nil для этого параметра». Предупреждение появляется для пользователя, и первый UIViewController говорит: «Я завершил представление предупреждения», а затем запускает функцию cpuTurn.

Вы хотите поместить код в обработчик UIAlertAction, который у вас уже есть. Вы должны переместить вызов cpuTurn на функцию crazyEightPlayed (или, по крайней мере, вызвать cpuTurn from crazyEightPlayed)

0

Вы можете попробовать отключить подчиненные представления, которые имеют взаимодействие. Я хотел бы отметить эти подпункты, а затем только активировать их позже.

Swift 2:

var disabledSubviews = [UIView]() 

let alert = UIAlertController(title: "Title", message: "Message", preferredStyle: .Alert) 
alert.addAction(UIAlertAction(title: "Ok", style: .Default, handler: { (action) in 
    for subview in disabledSubviews { 
     subview.userInteractionEnabled = true 
    } 
})) 

self.presentViewController(alert, animated: true) { 
    for subview in self.view.subviews { 
     if subview.userInteractionEnabled == true { 
      disabledSubviews.append(subview) 
      subview.userInteractionEnabled = false 
     } 
    } 
} 

Swift 3:

var disabledSubviews = [UIView]() 

let alert = UIAlertController(title: "Title", message: "Message", preferredStyle: .alert) 
alert.addAction(UIAlertAction(title: "Ok", style: .default, handler: { (action) in 
    for subview in disabledSubviews { 
     subview.isUserInteractionEnabled = true 
    } 
})) 
self.present(alert, animated: true) { 
    for subview in self.view.subviews { 
     if subview.isUserInteractionEnabled == true { 
      disabledSubviews.append(subview) 
      subview.isUserInteractionEnabled = false 
     } 
    } 
}