Ios Swift 4:无法识别的选择器发送到实例错误
我正在使用swift 4中的UILocalizedIndexedCollation,不断出现以下错误: 异常:-[\u SwiftValue localizedTitle]:发送到实例0x60000024cc00的选择器无法识别 2018-01-06 21:11:14.148103-0500 TableViewContacts[27012:2886540][Contacts]与XPC服务通信时出错:错误域=nscoaerrorDomain代码=4101连接到名为com.apple.contactsd的服务用户信息={NSDebugDescription=连接到名为com.apple.contactsd的服务} 我只是尝试使用contacts框架获取我的联系人,并将其显示在tableview上 这是我的排序规则的以下代码:Ios Swift 4:无法识别的选择器发送到实例错误,ios,swift,Ios,Swift,我正在使用swift 4中的UILocalizedIndexedCollation,不断出现以下错误: 异常:-[\u SwiftValue localizedTitle]:发送到实例0x60000024cc00的选择器无法识别 2018-01-06 21:11:14.148103-0500 TableViewContacts[27012:2886540][Contacts]与XPC服务通信时出错:错误域=nscoaerrorDomain代码=4101连接到名为com.apple.contact
let collation = UILocalizedIndexedCollation.current()
var sections: [[AnyObject]] = []
var objects: [Contact] = [] {
didSet {
let selector: Selector = #selector(getter: UIApplicationShortcutItem.localizedTitle)
sections = Array(repeating: [], count: collation.sectionTitles.count)
let sortedObjects = collation.sortedArray(from: objects, collationStringSelector: selector)
for object in sortedObjects {
let sectionNumber = collation.section(for: object, collationStringSelector: selector)
sections[sectionNumber].append(object as AnyObject)
}
DispatchQueue.main.async {
self.tableView.reloadData()
}
}
}
以及获取我的联系人:
private func fetchContacts(){
let store = CNContactStore()
store.requestAccess(for: (.contacts)) { (granted, err) in
if let err = err{
print("Failed to request access",err)
return
}
if granted {
print("Access granted")
let keys = [CNContactGivenNameKey, CNContactFamilyNameKey, CNContactPhoneNumbersKey]
let fetchRequest = CNContactFetchRequest(keysToFetch: keys as [CNKeyDescriptor])
fetchRequest.sortOrder = CNContactSortOrder.userDefault
do {
try store.enumerateContacts(with: fetchRequest, usingBlock: { ( contact, error) -> Void in
self.objects.append(Contact(contact: contact))
})
DispatchQueue.main.async {
self.tableView.reloadData()
}
}
catch let error as NSError {
print(error.localizedDescription)
}
}else{
print("Access denied")
}
}
}
我认为问题在于选择器。对于swift 4,我们在声明函数并将其用作选择器时使用@objc。但是在这种情况下,我不知道把它放在哪里。是的,你的选择器错了。下面是我最后为让选择器工作所做的
var objects: [CollationIndexable] = [] {
didSet {
sections = Array(repeating: [], count: collation.sectionTitles.count)
let selector = #selector(getter: CollationIndexable.collationString)
let sortedObjects = collation.sortedArray(from: objects, collationStringSelector: selector)
for object in sortedObjects {
let sectionNumber = collation.section(for: object, collationStringSelector: selector)
sections[sectionNumber].append(object as AnyObject)
}
self.tableView.reloadData()
}
}
这是我的协议,您的对象应该实现
@objc protocol CollationIndexable {
@objc var collationString : String { get }
}
下面是一个实现协议和选择器属性的具体CollationIndexable类型的示例
extension Contact : CollationIndexable {
@objc var collationString : String {
return lastName
}
}
到底是哪一行导致了错误?添加异常断点并重新运行。你解决过这个问题吗,我面临着同样的错误