2015-08-11 2 views
-2

У меня есть класс в быстром файле cloud. Я использую ссылку на этот class в своем проекте, чтобы вызвать два из его методов. Но я получаю следующую ошибку, и приложение вылетает;Ошибка: непризнанный селектор при использовании ссылки на класс

NSForwarding: warning: object 0x7fc938717160 of class 'App.Cloud' does not implement methodSignatureForSelector: -- trouble ahead

Unrecognized selector -[App.Cloud persistentStoreWillChange]

(lldb)

Кто-нибудь знает, кто я могу это решить и почему это происходит? PS: Ошибка появляется только при установке приложения и запуске в первый раз. Если я уйду и перезапустите, он не появится, однако он не будет выполнять методы.

Heres мой класс,

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

}  

ссылка Класс в View Controller:

let iCloudSync = Cloud() 

override func viewWillAppear(animated: Bool) { 

    iCloudSync.addObsevers() 

    loadData() 

} 

override func viewWillDisappear(animated: Bool) { 
    iCloudSync.removeObservers() 
} 
+0

На какой линии ??? – luk2302

+0

Не совсем уверен, что получаю смешанные результаты при использовании контрольных точек, но, глядя на ошибку, я пропустил следующую строку; 'Unrecognized selector - [Jottit.Cloud persistentStoreDidChange]' – RileyDev

+0

Сделал изменения в цитате блока ошибок в моем вопросе для полной ошибки вывода на консоль. – RileyDev

ответ

0

Вы изменили код, но вы забыли изменить метод заявления от

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

в

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

Ну ты это, о котором говорит позвонить persistentStoreDidChange на self при срабатывании уведомления:

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

Но тогда, похоже, вы не реализуете persistentStoreDidChange в пределах class Cloud.

Так что либо удалите этого наблюдателя, либо реализуйте метод.

+0

Я удалил наблюдателя для 'persistentStoreDidChange', но затем получил ошибку для' persistentStoreWillChange':/Это как-то связано с тем, как я использую ссылку класса? – RileyDev

+0

Должен ли я добавлять функции для 'persistentStoreDidChange' и' persistentStoreWillChange' в мой ** контроллер просмотра ** для методов 'iCloudSync.addObserver' и' iCloudSync.removeObserver' – RileyDev

+0

Это должно быть хорошо. Хотя я заметил, что ваш селектор уведомлений «WillChange:» имеет двоеточие в конце, но ваш «DidChange» этого не делает. Поскольку вы все равно не используете аргумент, попробуйте удалить двоеточие и сделать метод просто 'func persistentStoreWillChange() {'. –

0

Ваши методы имеют параметры, поэтому вы должны выразить это с помощью: «) в своих именах. Измененный код должен выглядеть следующим образом:

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

Еще не повезло :( – RileyDev

1

Вы должны получить class Cloud от NSObject, когда вы объявляете его, как это:

class Cloud : NSObject { 

В противном случае ваши селекторы являются невидимыми для Objective-C.

+0

Приветствия за это, но теперь я получаю следующую ошибку: «Завершение приложения из-за неотображенного исключения» NSInvalidArgumentException », причина: '- [App.Cloud persistentStoreDidChange:]: нераспознанный селектор отправлен в экземпляр 0x7f8d7e20ab20' – RileyDev

+0

Да, но вы _know_ почему это. '" persistentStoreDidChange: "' (с двоеточием) не соответствует вашему объявлению 'func persistentStoreDidChange()'. См. мою книгу, если вы не знаете, как выразить имя функции как селектор : http://www.apeth.com/swiftBook/apa.html#_селекторы – matt

 Смежные вопросы

  • Нет связанных вопросов^_^