【问题标题】:Swift - Delegates - How do I link the protocol to the implemented delegate methods?Swift - Delegates - 如何将协议链接到已实现的委托方法?
【发布时间】:2015-09-01 12:54:12
【问题描述】:

我想使用委托使我的单元格(来自 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步。

你能帮帮我吗?

感谢您的宝贵时间。

【问题讨论】:

    标签: ios iphone swift delegates protocols


    【解决方案1】:

    您缺少最后一步:填充Cell 类的delegate 属性。我通常在cellForRowAtIndexPath

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

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

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

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

    【讨论】:

    • cell.delegate = self 部分,Xcode 告诉我我分配了错误的值类型。我知道在 Objective-C 中,您可以将委托设置为 id 以允许它考虑任何类型。你知道如何在 Swift 中做到这一点吗?
    • 我的猜测是该类没有实现委托协议 - 你的 ViewController 是在实现 CellDelegate 吗?
    • 我在ViewController 上设置了一个扩展名,正如您在我最初的问题中看到的那样。也许以经典方式实现它会更好?我试试看。
    • 不应该可以——我通常通过扩展来实现协议。你能显示实际的编译器错误信息吗?
    • 这里是:Cannot assign a value of type 'GridController' to a value of type 'CellDelegate?'。我想我明白了:我在一个没有实现CellDelegate 的控制器中调用委托,正如你之前所说的......我混淆了这两个控制器。谢谢你的帮助,现在可以了;-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-14
    • 2018-01-13
    • 1970-01-01
    • 2010-12-19
    • 2020-01-04
    • 1970-01-01
    • 2021-03-14
    相关资源
    最近更新 更多