Я следовал this tutorial, чтобы иметь методы делегирования для обновления значения в моем другом классе, но он даже не вызывает его. Не могли бы вы рассказать мне, что я делаю неправильно?Протокол/делегат в Swift3 не работает
protocol myDelegate {
func report(info:String)
}
class TypeFilterViewController: UIViewController, XLFormRowDescriptorViewController,
UITableViewDataSource, UITableViewDelegate {
var delegate:myDelegate?
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
self.delegate?.report("testValue")
self.navigationController?.popViewControllerAnimated(true)
}
}
Итак, после того, как я выбираю элемент строки, я отклонил нажатый вид и отобразил предыдущий класс.
class SearchRefinementsTypeCell: XLFormBaseCell, XLFormBaseCellSeparator, myDelegate {
// Delegate method
func report(info: String) {
print("delegate: \(info)")
}
override func update() {
super.update()
let mc = TypeFilterViewController()
mc.delegate = self
self.headerLabel.text = //Value from TypeFilterViewController didSelectRow
}
Благодарим за помощь.
Зачем вам нужно делегировать от контроллера к ячейке, а не наоборот? Вы создаете новый объект контроллера в классе ячейки при каждом вызове функции update() и никогда не используете этот объект, он просто выдается, когда функция завершена. – alexburtnik
Я использую библиотеку Xlform, поэтому SearchRefinementsTypeCell - это моя настраиваемая ячейка в основном вид не в TypeFilterViewController, а TypeFilterViewController имеет собственную ячейку. Эти 2 фактически не связаны друг с другом. Но почему-то мне нужно обновить метку в этом SearchRefinementsTypeCell после того, как пользователь выберет ячейку под TypeFilterViewController и запустил didSelectRow. Надеюсь, я смогу это объяснить. – Umitk
Отличный ответ от @alexburtnik. Я полностью согласен. Протокол должен быть частью пользовательского класса ячеек, а контроллер представления должен соответствовать протоколу. Вам нужно перевернуть все вокруг. – user3353890