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!")
    }


Данный принт не выводится.
  • Вопрос задан
  • 91 просмотр
Решения вопроса 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 может много где появляться.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы