如何修复“'NSInvalidArgumentException',原因:'-[__NSCFNumber caseInsensitiveCompare:]:发送到实例的无法识别的选择器”?
How to fix "'NSInvalidArgumentException', reason: '-[__NSCFNumber caseInsensitiveCompare:]: unrecognised selector sent to instance"?
我正在创建一个新应用程序,需要帮助让我的核心数据实体在单击相应的 tableView 单元格时更新字段。
我尝试用谷歌搜索错误和类似错误,但我能找到的所有内容都在 Objective-c 或 swift 的旧版本中。我正在使用 swift。我也在使用 NSFetchedResultsController 来获取数据。
这是我的 tableView 所做的 selectRowAt
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
let item = fetchedRC.object(at:indexPath)
/*if item.isComplete {
item.setValue(false, forKey: "isComplete")
//item.isComplete = false
} else {
item.setValue(true, forKey: "isComplete")
//item.isComplete = true
}*/
item.isComplete.toggle()
do {
try context.save()
tableView.reloadRows(at: [indexPath], with: .automatic)
} catch let error as NSError {
print("Could not save. \(error.localizedDescription)")
}
}
当用户单击单元格时,我希望 IsComplete
根据它是真还是假来切换它的值。但是它实际上做的是在 if 语句的两种情况下调用 'setValue' 时崩溃。错误信息是:
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFNumber caseInsensitiveCompare:]: unrecognised selector sent to instance 0x9321d02e963b75fc'
编辑:
我相信这是 isComplete 的声明
extension Item {
@nonobjc public class func fetchRequest() -> NSFetchRequest<Item> {
return NSFetchRequest<Item>(entityName: "Item")
}
@NSManaged public var name: String?
@NSManaged public var isComplete: Bool
@NSManaged public var list: List?
}
还有 DidSet:
var detailedList: List! {
didSet {
}
}
请求和排序
let request = Item.fetchRequest() as NSFetchRequest<Item>
request.predicate = NSPredicate(format: "list = %@", parentObj)
let sort = NSSortDescriptor(key: #keyPath(Item.isComplete), ascending: true, selector: #selector(NSString.caseInsensitiveCompare(_:)))
request.sortDescriptors = [sort]
do {
fetchedRC = NSFetchedResultsController(fetchRequest: request, managedObjectContext: context, sectionNameKeyPath: nil, cacheName: nil)
try fetchedRC.performFetch()
self.tableView.reloadData()
} catch let error as NSError{
print(error.localizedDescription)
}
fetchedRC.delegate = self
发生错误是因为您无法使用 caseInsensitiveCompare
选择器对 Bool
值进行排序。
只需使用标准描述符
let sort = NSSortDescriptor(key: #keyPath(Item.isComplete), ascending: true)
我正在创建一个新应用程序,需要帮助让我的核心数据实体在单击相应的 tableView 单元格时更新字段。
我尝试用谷歌搜索错误和类似错误,但我能找到的所有内容都在 Objective-c 或 swift 的旧版本中。我正在使用 swift。我也在使用 NSFetchedResultsController 来获取数据。
这是我的 tableView 所做的 selectRowAt
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
let item = fetchedRC.object(at:indexPath)
/*if item.isComplete {
item.setValue(false, forKey: "isComplete")
//item.isComplete = false
} else {
item.setValue(true, forKey: "isComplete")
//item.isComplete = true
}*/
item.isComplete.toggle()
do {
try context.save()
tableView.reloadRows(at: [indexPath], with: .automatic)
} catch let error as NSError {
print("Could not save. \(error.localizedDescription)")
}
}
当用户单击单元格时,我希望 IsComplete
根据它是真还是假来切换它的值。但是它实际上做的是在 if 语句的两种情况下调用 'setValue' 时崩溃。错误信息是:
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFNumber caseInsensitiveCompare:]: unrecognised selector sent to instance 0x9321d02e963b75fc'
编辑: 我相信这是 isComplete 的声明
extension Item {
@nonobjc public class func fetchRequest() -> NSFetchRequest<Item> {
return NSFetchRequest<Item>(entityName: "Item")
}
@NSManaged public var name: String?
@NSManaged public var isComplete: Bool
@NSManaged public var list: List?
}
还有 DidSet:
var detailedList: List! {
didSet {
}
}
请求和排序
let request = Item.fetchRequest() as NSFetchRequest<Item>
request.predicate = NSPredicate(format: "list = %@", parentObj)
let sort = NSSortDescriptor(key: #keyPath(Item.isComplete), ascending: true, selector: #selector(NSString.caseInsensitiveCompare(_:)))
request.sortDescriptors = [sort]
do {
fetchedRC = NSFetchedResultsController(fetchRequest: request, managedObjectContext: context, sectionNameKeyPath: nil, cacheName: nil)
try fetchedRC.performFetch()
self.tableView.reloadData()
} catch let error as NSError{
print(error.localizedDescription)
}
fetchedRC.delegate = self
发生错误是因为您无法使用 caseInsensitiveCompare
选择器对 Bool
值进行排序。
只需使用标准描述符
let sort = NSSortDescriptor(key: #keyPath(Item.isComplete), ascending: true)