错误:使用类引用时无法识别的选择器

Posted

技术标签:

【中文标题】错误:使用类引用时无法识别的选择器【英文标题】:Error: Unrecognised Selector when using class reference 【发布时间】:2015-08-11 21:06:32 【问题描述】:

我在名为 cloud 的 swift 文件中有一个类,我在我的项目中使用对 class 的引用来调用它的两个方法。但我收到以下错误并且应用程序崩溃;

NSForwarding: 警告: 'App.Cloud' 类的对象 0x7fc938717160 确实 不实现 methodSignatureForSelector: -- 前面的麻烦

无法识别的选择器 -[App.Cloud persistentStoreWillChange]

(lldb)

有谁知道我可以解决这个问题以及为什么会发生这种情况? PS:该错误仅在安装应用程序并首次启动时出现。如果我退出并重新启动它不会出现,但是它不会执行这些方法。

这是我的课,

class Cloud 

let moc = (UIApplication.sharedApplication().delegate as! AppDelegate).managedObjectContext

func persistentStoreWillChange (notification:NSNotification) 

    self.moc!.performBlock  () -> Void in
        if self.moc!.hasChanges 
            var error:NSError? = nil
            self.moc!.save(&error)
            if error != nil 
                println("Save error: \(error)")
             else
                // drop any manged object refrences
                self.moc!.reset()
            

        
    


func persistentStoreDidChange () 
    println("Store Did Change")



//Refresh Data
func recieveChanges (notification:NSNotification)
    self.moc!.performBlock  () -> Void in
        self.moc!.mergeChangesFromContextDidSaveNotification(notification)
    


//View Will Appear
func addObsevers() 

NSNotificationCenter.defaultCenter().addObserver(self, selector: "persistentStoreDidChange:", name: NSPersistentStoreCoordinatorStoresDidChangeNotification, object: nil)

 NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("persistentStoreWillChange:"), name:NSPersistentStoreCoordinatorStoresWillChangeNotification, object: moc!.persistentStoreCoordinator)

 NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("recieveICloudChanges:"), name:NSPersistentStoreDidImportUbiquitousContentChangesNotification, object: moc!.persistentStoreCoordinator)



//View Will Dissapear
func removeObservers() 

 NSNotificationCenter.defaultCenter().removeObserver(self, name: NSPersistentStoreCoordinatorStoresDidChangeNotification, object: nil)
 NSNotificationCenter.defaultCenter().removeObserver(self, name: NSPersistentStoreCoordinatorStoresWillChangeNotification, object: moc!.persistentStoreCoordinator)
 NSNotificationCenter.defaultCenter().removeObserver(self, name: NSPersistentStoreDidImportUbiquitousContentChangesNotification, object: moc!.persistentStoreCoordinator)


    

视图控制器中的类引用:

let iCloudSync = Cloud()

override func viewWillAppear(animated: Bool) 

    iCloudSync.addObsevers()

    loadData()



override func viewWillDisappear(animated: Bool) 
    iCloudSync.removeObservers()

【问题讨论】:

不完全确定我在使用断点时得到混合结果,但看看我错过了以下行的错误; Unrecognized selector -[Jottit.Cloud persistentStoreDidChange] 对我的问题中的错误块引用进行了更改以获取完整的控制台输出错误。 【参考方案1】:

声明时需要从 NSObject 派生class Cloud,如下所示:

class Cloud : NSObject 

否则你的选择器对 Objective-C 是不可见的。

【讨论】:

为此欢呼,但现在我收到以下错误Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[App.Cloud persistentStoreDidChange:]: unrecognized selector sent to instance 0x7f8d7e20ab20 是的,但你知道为什么会这样。 "persistentStoreDidChange:"(带有冒号)与您的声明 func persistentStoreDidChange() 不匹配。如果您不知道如何将函数名称表示为选择器,请参阅我的书:apeth.com/swiftBook/apa.html#_selectors【参考方案2】:

您更改了代码,但忘记更改方法声明

func persistentStoreDidChange () 
    println("Store Did Change")

func persistentStoreDidChange (notification: NSNotification) 
    println("Store Did Change")

【讨论】:

【参考方案3】:

你这样做,它说当通知触发时在self上调用persistentStoreDidChange

NSNotificationCenter.defaultCenter().addObserver(self,
  selector: "persistentStoreDidChange",
  name: NSPersistentStoreCoordinatorStoresDidChangeNotification,
  object: nil)

但是看起来你没有在class Cloud 中实现persistentStoreDidChange

所以要么移除那个观察者,要么实现这个方法。

【讨论】:

我删除了persistentStoreDidChange 的观察者,但随后得到persistentStoreWillChange 的错误:/这与我使用类引用的方式有关吗? 我是否应该将persistentStoreDidChangepersistentStoreWillChange 的函数添加到我的视图控制器 以用于方法iCloudSync.addObserver iCloudSync.removeObserver 应该没问题。虽然我注意到您的“WillChange:”通知选择器末尾有一个冒号,但您的“DidChange”没有。由于您无论如何都没有使用该参数,请尝试删除冒号并将方法设为 func persistentStoreWillChange() 我更新了我的问题中的云类以反映我的项目中的代码,我仍然收到Unrecognized selector -[Jottit.Cloud persistentStoreWillChange] 的错误 - 问题中也更新了完整错误 我已经在另一个项目中完成了这项工作,但是直接在视图控制器中使用了 Cloud 类中的代码。但是引用类并调用它的方法要干净得多,尤其是在整个项目中重用它时。【参考方案4】:

你的方法有参数,所以你必须在它们的名字中用':'来表达。更改后的代码应如下所示:

NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("persistentStoreWillChange:"), name: NSPersistentStoreCoordinatorStoresWillChangeNotification, object: moc!.persistentStoreCoordinator)
NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("recieveICloudChanges:"), name: NSPersistentStoreDidImportUbiquitousContentChangesNotification, object: moc!.persistentStoreCoordinator)

【讨论】:

以上是关于错误:使用类引用时无法识别的选择器的主要内容,如果未能解决你的问题,请参考以下文章

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

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

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

使用 MyAppDelegate 时无法识别的选择器

使用 Core Data 获取生成“无法识别的选择器错误”?

尝试将用户登录到 QBChat 时如何删除错误“无法识别的选择器”