iOS/Swift中UILocalizedIndexedCollation的collationStringSelector调用失败
解决UILocalizedIndexedCollation找不到已定义选择器的问题
最近在使用UILocalizedIndexedCollation的collationStringSelector方法时踩了个实打实的坑——明明已经按要求定义了选择器,程序却死活识别不到。先把我的场景代码贴出来,方便大家对照排查:
先看协议与类的定义
我首先定义了一个协议,要求实现用于排序的属性:
protocol ContactProtocol { var lastName: String { get } }
然后创建了遵循该协议的Contact类:
class Contact: ContactProtocol { let lastName: String init(lastName: String) { self.lastName = lastName } }
出错的调用代码
接着尝试用UILocalizedIndexedCollation处理排序逻辑:
let collation = UILocalizedIndexedCollation.current() collation.collationStringSelector = #selector(getter: ContactProtocol.lastName) // 这里直接报错,提示找不到对应的选择器
问题的关键解决办法
折腾了好半天才摸清楚根源:Contact类必须继承自NSObject!
因为UILocalizedIndexedCollation是基于Objective-C运行时机制实现的,只有继承自NSObject的类,它的属性才能被Objective-C的选择器系统识别到。另外,协议也最好加上@objc标记,确保能被OC runtime正确感知。
修改后的代码如下:
@objc protocol ContactProtocol { var lastName: String { get } } class Contact: NSObject, ContactProtocol { let lastName: String init(lastName: String) { self.lastName = lastName super.init() } }
这样再调用collationStringSelector就不会报错,排序功能也能正常工作了。
内容的提问来源于stack exchange,提问作者Michał Ziobro
相关产品推荐
相关产品推荐

