【问题标题】:How to fix "'NSInvalidArgumentException', reason: '-[__NSCFNumber caseInsensitiveCompare:]: unrecognised selector sent to instance"?如何修复“'NSInvalidArgumentException',原因:'-[__NSCFNumber caseInsensitiveCompare:]: unrecognized selector sent to instance”?
【发布时间】:2019-06-07 13:29:02
【问题描述】:

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

我尝试用谷歌搜索错误和类似错误,但我能找到的所有内容都在 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 根据它是真还是假来切换它的值。但它实际上所做的是在 if 语句的两种情况下调用“setValue”时崩溃。错误信息是:

*** 由于未捕获的异常 'NSInvalidArgumentException' 导致应用程序终止,原因:'-[__NSCFNumber caseInsensitiveCompare:]: unrecognized 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

【问题讨论】:

  • 该错误表明isComplete 的值在某处被视为字符串。顺便说一句,为什么不用item.isComplete = true(而不是KVC)或者干脆用item.isComplete.toggle() 替换整个if - else 表达式。
  • 好的,我什至不知道您可以切换该值,但不幸的是,这并没有解决问题。它仍然会因同样的错误而崩溃。
  • isCompleted 是如何声明的?如果错误仍在发生,则错误在类中
  • isCompleted 被声明为布尔值。课堂上的错误可能在哪里?
  • 我不知道。设置属性时,类中是否执行了任何代码,例如didSet 观察者? caseInsensitiveCompare 在现实中的某个地方被调用了吗?它也可以在sortfilter 操作中隐式使用。

标签: ios swift core-data ios13


【解决方案1】:

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

只需使用标准描述符

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

【讨论】:

  • 好的。我创建了这个,这个工作发现:let sort = NSSortDescriptor(key: "isComplete", ascending: true) 哪个更好用?
  • 文字字符串有效,但在编译时检查的语法更安全。但是 #keyPath 语法应该可以工作。也是。
  • 那么使用你提供的东西会更好吗?或者只是做let sort = NSSortDescriptor(key: #keyPath(Item.isComplete), ascending: true) 也可以吗?
  • 您好,感谢您帮助解决问题!我不确定这是否需要在新问题中提出,但我将如何再次调用它或将选定的单元格移动到它应该根据排序的位置?
  • 这是一个新问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-05-22
  • 1970-01-01
  • 1970-01-01
  • 2020-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多