Pracuję nad stworzeniem aplikacji z Core Data. Kiedy utworzyłem instancję przy użyciu:
let entity = NSEntityDescription.entityForName("User", inManagedObjectContext: appDelegate.managedObjectContext)
let user = User(entity: entity, insertIntoManagedObjectContext: appDelegate.managedObjectContext)
Otrzymałem ostrzeżenie w dzienniku:
CoreData: warning: Unable to load class named 'User' for entity 'User'. Class not found, using default NSManagedObject instead.
Jak mogłem to naprawić?
I kolejne pytanie, jak zdefiniować metodę instancji w podklasie NSManagedObject?
Edytować:
Podałem klasę jednostki, jak na poniższym zrzucie ekranu:
ios
core-data
swift
nsmanagedobject
MsrButterfly
źródło
źródło
Odpowiedzi:
Aktualizacja dla Xcode 7 (wersja ostateczna): Wstawianie nazwy modułu do klasy (jak w Xcode 6 i wczesnych wersjach beta Xcode 7) nie jest już konieczne. Dokumentacja Apple dotycząca implementacji podklas obiektów zarządzanych podstawowymi danymi została odpowiednio zaktualizowana.
Inspektor modelu danych ma teraz dwa pola „Klasa” i „Moduł” dla encji:
Podczas tworzenia podklasy obiektów zarządzanych Swift dla encji pole „Moduł” jest ustawione na „Bieżący moduł produktu”, a przy tym ustawieniu tworzenie instancji działa zarówno w aplikacji głównej, jak i testach jednostkowych. Podklasy obiektu zarządzanego nie mogą być oznaczone
@objc(classname)
(zaobserwowano to na stronie https://stackoverflow.com/a/31288029/1187415 ).Alternatywnie możesz opróżnić pole „Moduł” (wyświetli się „Brak”) i oznaczyć podklasy obiektów zarządzanych za pomocą
@objc(classname)
(zaobserwowano to w https://stackoverflow.com/a/31287260/1187415 ).Uwaga: Ta odpowiedź została pierwotnie napisana dla Xcode 6. W różnych wersjach beta Xcode 7 wprowadzono pewne zmiany w odniesieniu do tego problemu. Ponieważ jest to akceptowana odpowiedź z wieloma pozytywnymi opiniami i linkami do niej, próbowałem podsumować sytuację dla bieżącej ostatecznej wersji Xcode 7.
Zrobiłem zarówno własne „badania”, jak i przeczytałem wszystkie odpowiedzi zarówno na to pytanie, jak i na podobne pytanie CoreData: ostrzeżenie: Nie można załadować klasy o nazwie . Tak więc przypisanie dotyczy wszystkich z nich, nawet jeśli nie wymieniam ich szczegółowo!
Poprzednia odpowiedź dla Xcode 6 :
Jak opisano w sekcji Implementowanie podklas obiektów zarządzanych podstawowymi danymi , należy poprzedzić nazwę klasy jednostek w polu Klasa w inspektorze jednostek modelu nazwą modułu, na przykład „MyFirstSwiftApp.User”.
źródło
@objc(ClassName)
metodę sugerowaną w odpowiedzi Christera.Tak na marginesie. miałem ten sam problem. Wszystko, co musiałem zrobić, to dodać
@objc(ClassName)
plik mojej klasy.Przykład:
I to rozwiązało mój problem.
źródło
Przyjęta odpowiedź na to pytanie pomogła mi rozwiązać ten sam problem, ale miałem zastrzeżenie, które moim zdaniem będzie pomocne dla innych. Jeśli nazwa twojego projektu (modułu) zawiera spację, musisz zastąpić spację podkreśleniem. Na przykład:
Jednostka: MyEntity Klasa: My_App_Name.MyClass
źródło
Pamiętaj, aby usunąć swój moduł :
źródło
W zależności od tego, czy korzystasz z funkcji App vs Tests, problem może polegać na tym, że aplikacja szuka,
<appName>.<entityName>
a kiedy działa jako test, wygląda jak<appName>Tests.<entityName>
. Rozwiązaniem, którego używam w tej chwili (Xcode 6.1) jest NIE wypełnianieClass
pola w interfejsie użytkownika CoreData i zrobienie tego w kodzie.Ten kod wykryje, czy korzystasz z funkcji App vs Tests i użyje właściwej nazwy modułu i zaktualizuje
managedObjectClassName
.źródło
Jeśli używasz łącznika w nazwie projektu, np. „Moja aplikacja”, użyj podkreślenia zamiast łącznika, np. „Moja_Aplikacja.MojeManagedObject”. Ogólnie spójrz na nazwę pliku xcdatamodeld i użyj tego samego przedrostka, co w tej nazwie. To znaczy „My_App_1.xcdatamodeld” wymaga przedrostka „My_App_1”
źródło
Może to pomóc tym, którzy mają ten sam problem. Byłem, ze Swift 2 i Xcode 7 beta 2.
Rozwiązaniem w moim przypadku było wypowiedzieć się
@objc(EntityName)
wEntityName.swift
.źródło
Miałem to samo ostrzeżenie, chociaż moja aplikacja wyglądała na dobrze. Problem polegał na tym, że podczas uruchamiania Edytor> Utwórz podklasę NSManagedObject na ostatnim ekranie użyłem domyślnej lokalizacji grupy, bez wyświetlanych lub zaznaczonych obiektów docelowych, co zapisywało podklasę w górnym katalogu MyApp, w którym znajdował się MyApp.xcodeproj.
Ostrzeżenie zniknęło, gdy zamiast tego zmieniłem grupę na podfolder MyApp i sprawdziłem cel MyApp.
źródło
Powyższe odpowiedzi były pomocne. Ta szybka kontrola poczytalności może zaoszczędzić trochę czasu. Przejdź do Project> Build Phases> Compile Sources i usuń swój xcdatamodeld oraz pliki modelu za pomocą przycisku „-”, a następnie dodaj je z powrotem za pomocą przycisku „+”. Przebuduj - to może się tym zająć.
źródło
Nawiasem mówiąc, uważaj na to, co dodajesz jako przedrostek: Moja aplikacja nazywa się „ABC-def”, a Xcode przekształcił „-” w „_”.
Aby być bezpiecznym, zajrzyj do wyszukiwarki, znajdź pliki projektu i zobacz, co mówi o modelu danych (na przykład „ABC_def.xcdatamodeld”) i użyj tego, co tam jest napisane DOKŁADNIE !!!
źródło
Powyższe odpowiedzi pomogły mi rozwiązać inny problem związany z Objective-C (może komuś pomoże):
Jeśli zrefaktorowałeś nazwy encji, nie zapomnij zmienić „Class” w „Utilities Panel”.
źródło
Powyższe odpowiedzi pomogły mi, ale może komuś pomóc. Jeśli tak jak ja wykonałeś je i nadal masz problem, pamiętaj, aby po prostu „wyczyścić swój projekt”. W przypadku XCode8, produkt> Wyczyść. Następnie biegnij ponownie.
źródło
W Xcode 7 nazwy jednostek i klas mogą być takie same, ale Codegen powinno być definicją klasy. W takim przypadku nie będzie ostrzeżenia itp. Wprowadź tutaj opis obrazu
źródło