Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 错误:使用类引用时无法识别选择器_Ios_Swift_Class_Icloud_Nsnotificationcenter - Fatal编程技术网

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

Ios 错误:使用类引用时无法识别选择器,ios,swift,class,icloud,nsnotificationcenter,Ios,Swift,Class,Icloud,Nsnotificationcenter,我在swift文件中有一个名为cloud的类,我在项目中使用对该类的引用来调用它的两个方法。但我得到以下错误,应用程序崩溃 NSForwarding:警告:“App.Cloud”类的对象0x7fc938717160不存在 未实现methodSignatureForSelector:--前面有问题 无法识别的选择器-[App.Cloud persistentstorehillchange] (lldb) 有谁知道我能解决这个问题,以及为什么会发生这种情况? PS:此错误仅在安装应用程序并首次启动时

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

NSForwarding:警告:“App.Cloud”类的对象0x7fc938717160不存在 未实现methodSignatureForSelector:--前面有问题

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

(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()
}

您可以这样做,即在触发通知时调用
persistentStoreDidChange
on
self

NSNotificationCenter.defaultCenter().addObserver(self,
  selector: "persistentStoreDidChange",
  name: NSPersistentStoreCoordinatorStoresDidChangeNotification,
  object: nil)
但是看起来您没有在
类云中实现
persistentStoreDidChange


因此,要么删除该观察者,要么实现该方法。

您的方法具有参数,因此必须在名称中用“:”表示。更改后的代码应如下所示:

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

声明NSObject时,需要从NSObject派生
类云
,如下所示:

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

否则,您的选择器对Objective-C不可见。

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

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


我不确定在使用断点时得到的结果好坏参半,但看看错误,我漏掉了下面一行<代码>无法识别的选择器-[Jottit.Cloud persistentStoreDidChange]
更改了问题中关于完整控制台输出错误的错误块引号。我删除了
persistentStoreDidChange
的观察器,但得到了
persistentStoreWillChange的错误。:/code>是否与我如何使用类引用有关?我是否应该为添加函数
persistentStoreDidChange
persistentstore将更改方法
iCloudSync.addObserver
iCloudSync.removeObserver
的我的视图控制器,这应该可以。虽然我注意到您的“WillChange:”通知选择器在末尾有一个冒号,但您的“DidChange”没有。由于您没有使用参数,请尝试删除冒号并使该方法仅为
func persistentStoreWillChange(){
。我在问题中更新了cloud类以反映项目中的代码,我仍然收到
无法识别的选择器-[Jottit.cloud persistentStoreWillChange]的错误
-问题中的完整错误也在更新中。我在另一个项目中也这样做了,但在视图控制器中直接使用了来自类云的代码。但是引用类并调用其方法要干净得多,特别是在整个项目中重用它时。为此我感到高兴,但现在我得到了以下错误
Termi由于未捕获的异常“NSInvalidArgumentException”,正在生成应用程序,原因:'-[app.Cloud persistentStoreDidChange::]:未识别的选择器发送到实例0x7f8d7e20ab20
是,但您知道原因。
“persistentStoreDidChange:
(带冒号)与您的声明不匹配
funct persistentStoreDidChange()
。如果您不知道如何将函数名表示为选择器,请参阅我的书: