unrecognized selector geschickt Instanz mit Coredata Swift
Ich bekomme immer diese Fehlermeldung, wenn ich versuche ein update Wert des core-Datenmodells.
Hier ist mein Modell
import Foundation
import CoreData
@objc(Habit)
class Habit: NSManagedObject {
@NSManaged var name: String
@NSManaged var trackingType: NSNumber
}
Hier ist mein code tableViewCell
override func setSelected(selected: Bool, animated: Bool) {
super.setSelected(selected, animated: animated)
if selected {
self.accessoryType = UITableViewCellAccessoryType.Checkmark
if self.habit? != nil {
self.habit?.trackingType = index
}
} else {
self.accessoryType = UITableViewCellAccessoryType.None
}
//Configure the view for the selected state
}
Ich bekomme den Fehler "Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[Gewohnheit setTrackingType:]: unrecognized selector geschickt Instanz 0x7fdcbb002c90'"
in Zeile
selbst.Gewohnheit?.trackingType = index
Ich bin kämpfen, um dieses Update für die letzten 2 Tage.
Edit:
Modell Gewohnheit wird initialisiert unten Weg
func getHabits() -> [AnyObject]{
let entityDescription =
NSEntityDescription.entityForName("Habit",
inManagedObjectContext: managedObjectContext!)
let request = NSFetchRequest()
request.entity = entityDescription
//
// let pred = NSPredicate(format: "(trackingType != -1)")
// request.predicate = pred
var error: NSError?
var objects = managedObjectContext?.executeFetchRequest(request,
error: &error)
return objects!;
}
Die zurückgegebene Liste wird verwendet, um überall in der app. Im Grunde Hole ich meine und Element aus der Liste und aktualisieren Ihre Attribute und speichern Sie es dann wieder
- Wo/wie ist
self.habit
initialisiert? Vielleicht ist Sie nicht der designierte Initialisiererinit(entity: , insertIntoManagedObjectContext:)
? Vergleichen Sie in stackoverflow.com/questions/23835525/.... - Ich habe bereits Durchlaufen alle diese links, aber keiner von Ihnen konnte helfen. Ich bearbeitet meine Frage für Eure Kommentare
- Ich denke, das hat etwas zu tun mit dem Gedächtnis, aber ich bin nicht in der Lage, um herauszufinden, in swift
- Wie ist
index
definiert? - Hast du das automatische generieren der Klasse?
- Kein index definiert ist. Ja, ich habe generiert die Klasse mit xcode aus dem Modell
- Was der Fehler bedeutet, dass Ihre Gewohnheit Klasse nicht implementiert
setTrackingType:
. Sie erklärte es, aber die Umsetzung war nie definiert. - Hier ist noch mal beantworten, wenn mittels Swift 3, XCode Beta-8 - forums.developer.apple.com/thread/50885
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ok, also der Grund, Sie sind immer die Fehler, sicherlich weil die referenzierten Objekts durch
self.habit
ist nicht einHabit
Objekt. Der einfachste Weg, um herauszufinden, was das Objekt wirklich ist, ist zu nennen:Mit Kern-Daten und benutzerdefinierte
NSManagedObjects
Sie benötigen, um sicherzustellen, dass die Entität: "Gewohnheit" (in deinem Daten-Modell) hat ein Klasse set zur Gewohnheit. Dies stellt sicher, dass Core Data wirft Ihre abgerufenen Objekte einer Entität Beschreibung der 'Gewohnheit' - die Gewohnheit Klasse. Wenn Sie nicht tun, diese dann diegetHabits
func werden wieder eine Reihe vonNSManagedObject
s nicht ein array vonHabit
s.Wenn dies der Fall ist, dann den code:println(NSStringFromClass(habit.class))
drucken "NSManagedObject" an den debugger.Als seitliche Anmerkung, die Sie wirklich brauchen, um auf Fehler zu überprüfen, wenn Sie Holen Gegenstände aus einer Core-Data-Datenbank. Fügen Sie die Zeilen:
Bitte verzeihen Sie mein swift, wenn es irgendwelche Fehler, die ich normalerweise verwenden Objective-C.
EDIT: um die richtige
Failed to call designated initializer on NSManagedObject class 'X'
Fehler. Dieser Fehler wird ausgelöst, wenn Sie nicht richtig instanziieren einesNSManagedObject
. Sie müssen nicht anrufen[[MyManagedObject alloc] init];
zu nenneninitWithEntity:insertIntoManagedObjectContext
statt:Wenn Sie nicht möchten, dass das Objekt
obj
werden in einen anderen Kontext eingefügt, die Sie übergeben können durch einenil
Kontext-argument. Allerdings, wenn Sie möchten, undo-management und die Fähigkeit zum speichern des Objekts in der Datenbank, muss es im Zusammenhang mit einem Kontext.Wenn Sie möchten, um eine benutzerdefinierte Initialisierung eines Objekts, dann können Sie überschreiben die
awakeFromInsert
undawakeFromFetch
Methoden/Funktionen.self.habit = [[Habit alloc] init];
(oder swift-äquivalent) überall? Der Fehler:Failed to call designated initializer on NSManagedObject class
in der Regel bedeutet, dass Sie falsch Initialisierung der Gewohnheit Objekt. Stattalloc
init
MÜSSEN Sie rufen:initWithEntity:insertIntoManagedObjectContext:
. Sie können passierennil
für dieNSManagedObjectContext
wenn Sie nicht wollen, dass dieHabit
Objekt assoziiert mit einem Kontext. Siehe mein edit-code.