Swift3中的协议/委托不起作用

时间:2016-11-01 16:36:03

标签: ios swift protocols

我跟着this tutorial有委托方法来更新我的其他类中的值,但它甚至没有触发它。你能告诉我我做错了什么吗?

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 个答案:

答案 0 :(得分:2)

你明显误解了教程。 当您想要从单元格委托给视图控制器时,委托模式很有用。你正在做相反的事情:将一个事件从一个viewController发送到一个单元格,这是没有意义的,因为你的viewController已经可以访问它的tableView,而tableView又用它的单元格进行操作。

此外,您不应该在单元格类中使用任何ViewController,因为它会破坏MVC模式。您应该将UITableViewCell和几乎每个UIView都视为无能为力的对象,这些对象无法自行决定任何事情,但只能将事件委托给其他聪明人,他们自己做逻辑(视图控制器)。

现在谈谈你的情况: 你有vc A和vc B,推过它。当按下B中的一个单元格时,你应该向A发送一个回调,对吧?你应该做什么:

  1. B有一个实现某些协议的委托
  2. 当A推动B时,它将自己设置为协议:b.delegate = self
  3. 在B中选择单元格时,调用委托方法,该方法在A中实现并将字符串传递给它。
  4. A中的UI已更新。
  5. 再一次,单元格不能知道任何关于任何视图控制器的信息,它们只是典当。应该在视图控制器本身之间处理所有逻辑。