делегат остается нулевым - PullRequest
0 голосов
/ 10 июня 2019

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

Я пытался установить делегат в разных местах получающего ViewController, включая ViewDidLoad, но делегат в отправляющем ViewController всегда равен нулю.

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

Вот то, чем я закончил.

Отправляющий ViewController:

protocol CreateChatDelegate: class{
    func appendChatData(_ sender: CreateChatViewController)
}

class CreateChatViewController: UIViewController {
     weak var delegate: CreateChatDelegate!

    @IBAction func createChat(_ sender: AnyObject) {
    delegate?.appendChatData(self)

        if delegate == nil {
            print("delegate unsuccessful")
        } else {
            print("delegate successful")
        }
}

Получающий ViewController:


class ViewController: UIViewController{
    var createChatViewController: CreateChatViewController!
    override func viewDidLoad() {
        super.viewDidLoad()
    ...

    }
}

extension ViewController: CreateChatDelegate {  
    func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        // get the reference to the ViewController
        self.createChatViewController = segue.destination as? CreateChatViewController

        // set it as delegate
        self.createChatViewController?.delegate = self
        print("ViewController: delegate successful")
        }
    }

    func appendChatData(_ sender: CreateChatViewController) {
        print("ViewController: CreateChatDelegate called")
    }

}

этот код выводит "делегат не выполнен", потому что делегат всегда равен nil

Ответы [ 3 ]

0 голосов
/ 10 июня 2019

Сначала убедитесь, что метод prepareForSegue () вызывается. Затем убедитесь, что он вызывается для CreateChatViewController, т.е.

if let destination = segue.destination as? CreateChatViewController {
    //Do all the stuff there e.g.
    destination.delegate = self
}

Если ваш метод prepareForSegue () не вызывается, тогда правильно установите действие, чтобы он вызвал метод prepareForSegue (), после чего вы получите значение делегата в CreateChatViewController.

0 голосов
/ 11 июня 2019

Используемый вами метод неверен. Вы должны использовать новый:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    ....
}

Обратите внимание на ключевое слово override? если вы не видите этого при написании методов viewController, это означает, что вы НЕ вызываете оригинальный метод и не ошиблись в сигнатуре функции.

ПРИМЕЧАНИЕ: если вы нацеливаетесь на более старую iOS и используете более старый Xcode, имя метода может отличаться, вы должны написать имя метода и позволить AutoComplete помочь вам с правильный.

0 голосов
/ 10 июня 2019

Для успешной настройки segue необходимо убедиться, что

1 - навигация запускается

self.performSegue(withIdentifier:"segue",sender:nil)

2- Принудительное развертывание

self.createChatViewController = segue.destination as! CreateChatViewController

как as? приведение может по какой-то причине произойти сбой

...