我有以下类层次结构:
class ScrollableViewController: UIViewController, UITableViewDelegate { // ... }
实现一个UITableViewDelegate
协议方法,例如tableView:willDisplayCellAt:
在继承自SpecificScrollableViewController
的班级ScrollableViewController
中,新的可选协议方法不再被调用,例如tableView(_:heightForRowAt:)
答案 0 :(得分:34)
tl; dr你需要在函数声明前加上Objective-C声明,例如:
@objc(tableView:heightForRowAtIndexPath:)
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
// return stuff
}
,我被告知这是一个解决方案
如果在声明一致性的类的子类中实现可选的Objective-C协议要求,您将看到一个警告,“实例方法'......几乎匹配协议的可选要求'...''''”< / p>
•解决方法:在执行可选要求之前添加
@objc(objectiveC:name:)
属性,并在其中包含原始Objective-C选择器。
我相当肯定这是一个错误:当协议方法在子类中时,似乎允许检查选择器功能的运行时动态在Grand Swift重命名中没有得到正确的桥接。使用Objective-C名称前缀函数声明正确地将Swift桥接到Objective-C,并允许在Objective-C中使用canPerformAction:withSender:
查询Swift 3重命名的方法
答案 1 :(得分:3)
对于普通的子类,这似乎在Swift 3.0.1中得到修复,但对于通用子类不是固定的:
class A: NSObject, UITableViewDelegate {}
class B: A {
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {}
}
class C<T>: A {
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {}
}
print(#selector(B.tableView(_:didSelectRowAt:))) // tableView:didSelectRowAtIndexPath:
print(#selector(C<Int>.tableView(_:didSelectRowAt:))) // tableView:didSelectRowAt:
请参阅:https://bugs.swift.org/browse/SR-2817
要修复它:https://stackoverflow.com/a/39416386/1109892
@objc(tableView:heightForRowAtIndexPath:)
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
// return stuff
}