2015-04-09 5 views
8

Ho appena aggiornato il mio progetto a 1.2 rapido. E dopo 5 o 6 azioni consecutive "Converti in ultima Swift" :), sono riuscito a farcela compilare. Poi ho fallito un sacco di test dell'interfaccia utente. Era dovuto al fatto che il mio 'NSFetchedResultsControllerDelegate' non era più chiamato.Rilevato delegato risultato controller non richiamato dopo aggiornamento rapido 1.2/xcode 6.3

Dopo (potrei dire) un tentativo molto fortunato, ho scoperto che ciò è dovuto al fatto che il mio delegato non era un NSObject. Quindi sono stato in grado di risolverlo sottoclassi NSObject o aggiungendo @obj.

Prima:

class BasicFetchedResultControllerDelegate : NSFetchedResultsControllerDelegate 

Dopo:

class BasicFetchedResultControllerDelegate : NSObject, NSFetchedResultsControllerDelegate 

Non credo che ho visto qualcosa legato a questo nel registro delle modifiche. Quali sono i cambiamenti che portano a questo. Hai notato altre modifiche come questa?

risposta

7

Ho ricevuto questo da Apple dopo che ho riempito un bug report:

Questo problema si comporta come previsto in base ai seguenti:

Si tratta di un cambiamento di comportamento a Swift 1.2: metodi in non- Le classi derivate da Objective-C non verranno più contrassegnate in modo implicito da @objc anche se corrispondono a un protocollo Objective-C. È possibile contrassegnare esplicitamente i metodi con l'attributo @objc se non si desidera estendere NSObject. Questo è descritto nelle note di rilascio di Xcode 6.3 allo https://developer.apple.com/library/ios/releasenotes/DeveloperTools/RN-Xcode/Chapters/xc6_release_notes.html#//apple_ref/doc/uid/TP40001051-CH4-SW3.

+1

Sono stato sbattere la testa per giorni chiedendo perché metodi delegato non vengono chiamati fino a quando ho trovato questo problema. Apple dovrebbe contrassegnarlo come errore di compilazione. Lezione appresa: non esitare a rendere le classi Swift ereditate NSObject. – hebinda

+0

Quando provo ad aggiungere NSObject nella mia classe ottengo ** ereditarietà multipla dalle classi 'UITableViewController' e 'NSObject' **, mentre l'aggiunta della dichiarazione @objc() non rende il metodo come dovrebbe. Cos'altro potrei provare? – carlodurso

+0

Un'altra avvertenza, Swift ignorerà silenziosamente i metodi delegate nelle classi generiche, anche se la classe estende 'NSObject' o usa' @ objc', ad es. 'classe F : NSObject, NSFetchedResultsControllerDelegate' fallirà silenziosamente. –

0

Le classi Core Data si comportano ancora molto come le classi Objective-C legacy. Poiché NSFetchedResultsController è un @protocol senza alcuna superclasse, Swift ha bisogno della dichiarazione esplicita NSObject.

E hai ragione, non c'è nulla a riguardo nei registri delle modifiche.

+2

Ho riempito un bug ad Apple, credo che 'NSFecthedResultsControllerDelegate' dovrebbe estendersi 'NSObjectProtocol' – valR