[标签比较:]:无法识别的选择器发送到实例

Posted

技术标签:

【中文标题】[标签比较:]:无法识别的选择器发送到实例【英文标题】:[Label compare:]: unrecognized selector sent to instance 【发布时间】:2021-09-03 16:57:32 【问题描述】:

我的应用程序因错误 unrecognized selector sent to instance 而崩溃,并且只是在我的应用程序 swift 文件中突出显示 @main,这并没有为我提供任何可能导致错误的线索。

我认为这可能与 @FetchRequest 中的冲突数据有关。我已将错误隔离到这些 sn-ps 代码中:

struct SidebarView: View 
    @Environment(\.managedObjectContext) private var viewContext
    @FetchRequest(entity: Label.entity(), sortDescriptors: [NSSortDescriptor(keyPath: \Label.name, ascending: true)])
    var labels: FetchedResults<Label>

    var body: some View 
        let allLabelNames = labels.map  "\($0.value(forKeyPath: "name")!)" 
        let labelNames = allLabelNames.uniqued()

         VStack
             NavigationLink(destination: AllDataView(names: labelNames))
                Text("View all data")
         
    

struct AllDataView: View 
    var imagesFetchRequest: FetchRequest<Sample>
    var images: FetchedResults<Sample>
        imagesFetchRequest.wrappedValue
    
    private var names: [String]

    init(names: [String])
        let samplesSortDescriptor = NSSortDescriptor(keyPath: \Sample.label, ascending: true)
        let predicate = NSPredicate(format: "label.name IN %@", names)
        self.names = names
        imagesFetchRequest = FetchRequest<Sample>(entity: Sample.entity(), sortDescriptors: [samplesSortDescriptor], predicate: predicate)
    

请注意,Label 是 NSManagedObject

关于如何调试此问题以找到我的应用程序中导致其崩溃的确切行的任何想法?

【问题讨论】:

给出完整的错误信息。 NSSortDescriptor(keyPath: \Sample.label, ascending: true) => NSSortDescriptor(keyPath: \Sample.label.name, ascending: true)?您正在尝试对label 属性进行排序,该属性是Label。所以它会在某个时候将Label 实例与另一个实例进行比较,调用compare(),这在你的情况下不起作用......你想在 name 属性上进行比较。 谢谢@Larne!这就是问题所在。如果您将其添加为答案,我会将其标记为正确。 【参考方案1】:
NSSortDescriptor(keyPath: \Sample.label, ascending: true) 

=>

NSSortDescriptor(keyPath: \Sample.label.name, ascending: true)

在第一个中,您尝试在其 label (Label) 属性上对 Sample 进行排序。 所以有一点,它会做[someLabelInstance compare:someOtherLabelInstance] 知道是否需要将哪个放在另一个之前。但是,Label 没有实例方法compare(),这就是您收到错误的原因。 您实际上想要对 labelname 属性进行排序。属性是 String(通过阅读您的代码隐含),并且是“可排序的”(实现 compare())。

【讨论】:

以上是关于[标签比较:]:无法识别的选择器发送到实例的主要内容,如果未能解决你的问题,请参考以下文章

iOS - 名称标签时出现“无法识别的选择器发送到实例”错误

NSInvalidArgumentException,使用 performSegueWithIdentifier 时发送到实例的无法识别的选择器

无法识别的选择器发送到实例 - 有人可以帮助我吗?

快速代码崩溃:“发送到实例的无法识别的选择器”

Swift 3:将无法识别的选择器发送到手势识别器实例

无法识别的选择器发送到实例,UISlider swfit3