【问题标题】:Protocol/delegate in Swift3 doesn't workSwift3 中的协议/委托不起作用
【发布时间】:2016-11-01 16:36:02
【问题描述】:

我已经按照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
    }

感谢您的各种帮助。

【问题讨论】:

  • 为什么你需要从控制器委托给一个单元,反之亦然?每次调用 update() 函数时,您都会在单元类中创建一个新的控制器对象,并且永远不要使用该对象,它只是在函数完成时释放
  • 我正在使用 Xlform 库,因此 SearchRefinementsTypeCell 是我在主视图中的自定义单元格,而不是在 TypeFilterViewController 中,并且 TypeFilterViewController 拥有另一个单元格。这2个实际上是没有关系的。但不知何故,在用户选择 TypeFilterViewController 下的单元格并触发 didSelectRow 后,我需要更新此 SearchRefinementsTypeCell 中的标签。我希望我能解释一下。
  • @alexburtnik 的好回答我完全同意。协议应该是自定义单元类的一部分,并且视图控制器应该符合协议。你需要把东西翻过来。
  • @umitk。所以你有两个视图控制器,对吧?在TypeFilterViewController 上选择单元格时,您实际上想要做什么?
  • 当单元格被选中时,它会关闭 TypeFilterViewController 并触发 update()。我想要做的是将 update() 中的标签设置为我在 TypeFilterViewController 中选择的值。

标签: ios swift protocols


【解决方案1】:

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

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

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

  1. B 有一个实现某些协议的委托
  2. 当 A 推送 B 时,它会将自身设置为协议:b.delegate = self
  3. 当在 B 中选择一个单元格时,您调用委托的方法,该方法在 A 中实现并将字符串传递给它。
  4. A 中的 UI 已更新。

再一次,cell 必须不知道任何关于您的任何视图控制器的信息,它们只是棋子。所有的逻辑都应该在视图控制器之间处理。

【讨论】:

  • 我按照你说的做了,但是没有触发。也许这是一种特殊情况,是的,使用 xlform 方法,但这里仍然应该有一种使用协议的方法。我不知道为什么..无论如何我都会对此表示赞同,并感谢您的帮助。
猜你喜欢
  • 2017-09-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多