2016-11-01 2 views
0

Я следовал 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 
    } 

Благодарим за помощь.

+1

Зачем вам нужно делегировать от контроллера к ячейке, а не наоборот? Вы создаете новый объект контроллера в классе ячейки при каждом вызове функции update() и никогда не используете этот объект, он просто выдается, когда функция завершена. – alexburtnik

+0

Я использую библиотеку Xlform, поэтому SearchRefinementsTypeCell - это моя настраиваемая ячейка в основном вид не в TypeFilterViewController, а TypeFilterViewController имеет собственную ячейку. Эти 2 фактически не связаны друг с другом. Но почему-то мне нужно обновить метку в этом SearchRefinementsTypeCell после того, как пользователь выберет ячейку под TypeFilterViewController и запустил didSelectRow. Надеюсь, я смогу это объяснить. – Umitk

+0

Отличный ответ от @alexburtnik. Я полностью согласен. Протокол должен быть частью пользовательского класса ячеек, а контроллер представления должен соответствовать протоколу. Вам нужно перевернуть все вокруг. – user3353890

ответ

2

Вы явно неправильно поняли учебник. Шаблон делегирования полезен, когда вы хотите делегировать из ячейки для просмотра контроллера. Вы делаете обратное: отправка события из viewController в ячейку, что бессмысленно, так как ваш viewController уже имеет доступ к его tableView, который в свою очередь работает с его ячейками.

Также вы не должны использовать класс ячеек ViewController, потому что он разрушает шаблон MVC. Вы должны думать о UITableViewCell и почти каждый UIView как о бессильных объектах, которые сами по себе ничего не могут решить, но могут делегировать события только другим умным парням, которые сами выполняют логику (контроллеры представлений).

Теперь о вашем случае: У вас есть vc A и vc B, толкнул его. Когда нажата ячейка в B, вы должны отправить обратный вызов на A, правильно? Что вы должны сделать:

  1. B имеет делегат, который реализует некоторый протокол
  2. Когда А выталкивает B, он Сет себя в качестве протокола: b.delegate = self
  3. При выборе ячейки в B, вы вызываете метод делегата , который реализован в A и передает в него строку.
  4. Пользовательский интерфейс в A обновлен.

Снова клетки не должны ничего знать ни о каком из ваших контроллеров, они просто пешки. Вся логика должна обрабатываться между самими диспетчерами.

+0

Я сделал то, что вы сказали, но оно не срабатывает. Может быть, это какой-то особый случай, да, используя метод xlform, но здесь все равно должен быть способ использования протоколов. я не знаю, почему .. я все равно поддержу это, и спасибо за помощь. – Umitk

Смежные вопросы