一尘不染

在子类中未调用Swift 3 ObjC可选协议方法

swift

我有以下类层次结构:

class ScrollableViewController: UIViewController, UITableViewDelegate { // ... }

实现一种UITableViewDelegate协议方法,例如tableView:willDisplayCellAt:

SpecificScrollableViewController继承自的类中,ScrollableViewController不再调用新的可选协议方法,例如tableView(_:heightForRowAt:)


阅读 200

收藏
2020-07-07

共1个答案

一尘不染

tl; dr,您需要在函数声明之前添加其Objective-C声明,例如

@objc(tableView:heightForRowAtIndexPath:)
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
  // return stuff
}

借助《Swift 3迁移指南》,我被告知这是一个解决方案,其中指出:

如果在声明符合性的类的子类中实现可选的Objective-C协议要求,则会看到警告,“实例方法’…’几乎与协议’…’的可选要求’…’相匹配”

•解决方法:@objc(objectiveC:name:)在实现可选要求之前,使用原始的Objective-C选择器添加一个属性。

我相当确定这是一个错误:当协议方法位于子类中时,允许检查选择器功能的运行时动态似乎未在Grand Swift重命名中正确桥接。使用Objective-
C名称前缀函数声明可以正确地将Swift桥接到Objective-C,并允许canPerformAction:withSender:从Objective-
C内部查询Swift 3重命名的方法

2020-07-07