Задать вопрос
AntonBrock
@AntonBrock
screen light

Где моя ошибка при делегирование?

Я знаю, что похожий вопрос уже был задан мною, но я до сих пор не понимаю, что я делаю не так! Я просидел около 2х дней смотря все возможный уроки и объяснения, в моей голове все укладывается в эти объяснения, НО это не работает! Надеюсь, Вы прольете свет, больше некому мне обратиться.
Итак, самый простой пример, что я пытаюсь сделать:
1) MainViewController
//Создаю протокол
protocol MainViewControllerDelegate {
  func sayHello()
}
// в override
 var delegate: MainViewControllerDelegate?

// пытался и в другом месте, не знаю, можно ли вызывать метод делегата из override
// вызываю
delegate?.sayHello()

2) SecondViewController, который открывается через сегвей из MainViewController
Там:
- подписываю класс на делегат
.. , MainViewControllerDelegate
- создаю переменную
var mainController = MainViewController()
В override:
mainController.delegate = self
И по совету XCODE вызываю функцию
func sayHello() {
        print("Hey!")
    }


Данный принт не выводится.
  • Вопрос задан
  • 93 просмотра
Подписаться 1 Простой 1 комментарий
Решения вопроса 1
Loriens
@Loriens
iOS Developer
Ошибка, скорее всего, здесь:
var mainController = MainViewController()

Так как вы используете segue, подозреваю, что ваш контроллер создан в сториборде. А вызов MainViewController() создаёт новый контроллер, который нигде не отображается.

Вы должны установить делегат в prepare for segue в классе MainViewController:
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if let destination = segue.destination as? SecondViewController {
        self.delegate = destination
    }
}


Также нужно использовать слабую ссылку на делегата, чтобы избежать retain cycle:
weak var delegate: MainViewControllerDelegate?

P. S. Лучше добавить больше кода, потому что непонятно, где конкретно вы вызываете функцию делегата. Эта фраза ни о чём не говорит:
можно ли вызывать метод делегата из override

Ключевое слово override может много где появляться.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы