Метод делегата UIAlertview не вызывается в дочернем контроллере представления

У меня два контроллера

VC A -> Parent а также VC B -> Child

Метод делегирования представления оповещения, т.е.

func alertView(View: UIAlertView!, clickedButtonAtIndex buttonIndex: Int){}

объявлен в VC A,

Когда я показываю предупреждение от VC B Метод делегата не вызывается при нажатии кнопки оповещения.

3 ответа

Следуйте этим шаг за шагом:

  1. Создайте протокол в вашем VC-B как:

    protocol AlertViewProtocol:class {
        func alertView(View: UIAlertView!, clickedButtonAtIndex buttonIndex: Int)
    }
    
  2. Добавьте переменную в свой класс VC-B как:

    var delegate: AlertViewProtocol?
    
  3. Используйте делегата в любом методе класса 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
    
  4. Примите протокол в вашем классе приема (здесь, VC-A):

    class ViewControllerA: UIViewController, AlertViewProtocol {
    ...
    ...
    }
    
  5. Реализуйте метод делегата в 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
    }
    
  6. Установите делегата в 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
Другие вопросы по тегам