Метод делегата UIAlertview не вызывается в дочернем контроллере представления
У меня два контроллера
VC A
-> Parent
а также VC B
-> Child
Метод делегирования представления оповещения, т.е.
func alertView(View: UIAlertView!, clickedButtonAtIndex buttonIndex: Int){}
объявлен в VC A
,
Когда я показываю предупреждение от VC B
Метод делегата не вызывается при нажатии кнопки оповещения.
3 ответа
Следуйте этим шаг за шагом:
Создайте протокол в вашем VC-B как:
protocol AlertViewProtocol:class { func alertView(View: UIAlertView!, clickedButtonAtIndex buttonIndex: Int) }
Добавьте переменную в свой класс VC-B как:
var delegate: AlertViewProtocol?
Используйте делегата в любом методе класса VC-B для отправки данных в метод приема (т. Е. Любой метод VC-A), который является любым методом, который принимает протокол. Следуйте этой схеме, чтобы использовать делегата:
delegate?.alertView(View: UIAlertView!, clickedButtonAtIndex buttonIndex: Int) // Above statement is like a method calling (on delegate var), use your parameters accordingly
Примите протокол в вашем классе приема (здесь, VC-A):
class ViewControllerA: UIViewController, AlertViewProtocol { ... ... }
Реализуйте метод делегата в VC-A:
func alertView(View: UIAlertView!, clickedButtonAtIndex buttonIndex: Int) { // Do your stuff // when you click on the designated button in your VC-B, this method will be invoked }
Установите делегата в VC-A, где вы создаете экземпляр объекта VC-B. В моем случае это как:
Вот,
vcb?.delegate = self
очень важно. Если вы забыли установить свойство делегата объекта с помощьюself
процесс делегирования не будет работать.
@IBAction func showVCB(sender: AnyObject) {
let vcb: ViewControllerB? = self.storyboard?.instantiateViewControllerWithIdentifier("viewcontrollerB") as? ViewControllerB
vcb?.delegate = self
self.presentViewController(vcb!, animated: true, completion: nil)
}
Надеюсь, это поможет вам понять процесс работы делегатов.
Вы устанавливаете AlertView
делегировать себе, значит сам Child
, Смени делегата на ВК А.
alertView.delegate = self.parent?.parent
protocol alertViewDelegate:class {
func alertView(View: UIAlertView!, clickedButtonAtIndex buttonIndex: Int)
}
Создайте объект делегата представления оповещения в родительском классе VC A
weak var delegate:alertViewDelegate() ?= nil
Реализуйте делегат в VC B и установите объект делегата в VC B
let alertview = alertView()
alertview.delegate = self