Swift - 委托 - 如何 link 实现委托方法的协议?

Swift - Delegates - How do I link the protocol to the implemented delegate methods?

我想使用委托让我的单元格(来自 UICollectionView)与我的 ViewController 通信。

在我的 Cell.swift 文件中,我像这样声明所需的协议(在 Cell class 之外):

protocol CellDelegate: class {
    func someMethod(param1: String?, param2 param2: Bool)
}

在同一个文件中,我声明委托如下:

class Cell: UICollectionViewCell {
     weak var delegate: CellDelegate?

     // ... some code ...

     @IBAction func someAction(sender: AnyObject) {
             delegate?.someMethod(param1, param2: true)
     }
}

现在在我的 ViewController 中,我正在实施 someMethod:

extension ViewController: CellDelegate {
     func someMethod(param1: String?, param2 param2: Bool) {

     // ... some code ...

     }
}

问题:我无法 link 协议及其实现,协议中的 cmd + click 无处可寻。在我的 @IBAction 中,someMethod 没有崩溃,但它什么也没做。

我看到 this topic 关于这个主题,但我不明白在哪里实施第 6 步。

你能帮帮我吗?

感谢您的宝贵时间。

您错过了最后一步:填充 Cell class 的 delegate 属性。我通常在 cellForRowAtIndexPath:

中这样做
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell = self.table.dequeueReusableCellWithIdentifier("myCellId") as! Cell
    cell.delegate = self
    ...
    return cell
}

请注意,在使用委托时没有 魔法 或自动行为:

  • 代表是一个协议(您的 CellDelegate 协议)
  • 您在 class 中实现了协议 您想要响应委托调用(您在 ViewController class 中做了)
  • 您在调用委托方法的 class 中创建了一个委托 属性(您在 Cell class 中创建了委托)
  • 您使用 class
  • 的实际实例初始化委托 属性

您刚刚错过了最后一步,使 属性 未初始化,因此任何使用可选链接的调用都计算为 nil(就像您在 someAction 方法中所做的那样),并且没有任何结果发生了。