Swift - 代理 - 如何将协议链接到已实现的委托方法?

时间:2015-06-16 15:34:58

标签: ios iphone swift delegates protocols

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

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

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 ...

     }
}

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

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

你能帮助我吗?

感谢您的时间。

1 个答案:

答案 0 :(得分:2)

您错过了最后一步:填充delegate类的Cell属性。我通常在cellForRowAtIndexPath中执行此操作:

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

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

  • 委托是一种协议(您的CellDelegate协议)
  • 您在要响应委托调用的类中实现协议(您在ViewController类中执行过)
  • 您在调用委托方法的类中创建委托属性(您在Cell类中执行过)
  • 使用类
  • 的实际实例初始化delegate属性

您错过了最后一步,让该属性保持未初始化状态,因此使用可选链接的任何调用都会计算为nil(就像您在someAction方法中所做的那样),并且没有任何反应。