如何解决“'NSInvalidArgumentException',原因:'-[__ NSCFNumber caseInsensitiveCompare:]:无法识别的选择器发送到实例”?

时间:2019-06-07 13:29:02

标签: ios swift core-data ios13

我正在创建一个新应用,并且当单击相应的tableView单元格时,需要帮助我的Core Data实体来更新字段。

我尝试了Google搜索该错误和类似的错误,但是我能找到的一切都是在Objective-c或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根据其值为true或false来切换其值。但是实际上,在if语句的两种情况下,当调用'setValue'时,它实际上都会崩溃。错误消息是:

  

***由于未捕获的异常'NSInvalidArgumentException'而终止应用,原因:'-[__ NSCFNumber caseInsensitiveCompare:]:无法识别的选择器已发送至实例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

1 个答案:

答案 0 :(得分:0)

发生错误是因为无法使用Bool选择器对caseInsensitiveCompare值进行排序。

只需使用标准描述符

let sort = NSSortDescriptor(key: #keyPath(Item.isComplete), ascending: true)