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