我有以下类层次结构:
class ScrollableViewController: UIViewController, UITableViewDelegate { // ... }
实现一种UITableViewDelegate协议方法,例如tableView:willDisplayCellAt:
UITableViewDelegate
tableView:willDisplayCellAt:
在SpecificScrollableViewController继承自的类中,ScrollableViewController不再调用新的可选协议方法,例如tableView(_:heightForRowAt:)
SpecificScrollableViewController
ScrollableViewController
tableView(_:heightForRowAt:)
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选择器添加一个属性。
如果在声明符合性的类的子类中实现可选的Objective-C协议要求,则会看到警告,“实例方法’…’几乎与协议’…’的可选要求’…’相匹配”
•解决方法:@objc(objectiveC:name:)在实现可选要求之前,使用原始的Objective-C选择器添加一个属性。
@objc(objectiveC:name:)
我相当确定这是一个错误:当协议方法位于子类中时,允许检查选择器功能的运行时动态似乎未在Grand Swift重命名中正确桥接。使用Objective- C名称前缀函数声明可以正确地将Swift桥接到Objective-C,并允许canPerformAction:withSender:从Objective- C内部查询Swift 3重命名的方法
canPerformAction:withSender: