Ich habe ein einfaches Modell Foo
, das eine Benutzerpräferenz darstellt und eine NSString
und eine NSNumber
einkapselt. Ich möchte ein Array von Foo
in Benutzerstandards speichern, so dass sie zwischen den Starts der Anwendung bestehen bleiben; und ich möchte sie in einer Tabellenansicht anzeigen, sodass der Benutzer sie hinzufügen, entfernen und bearbeiten kann. Die Lösung dafür schien mit Bindings ziemlich einfach zu sein, aber es ist mir unmöglich, tatsächlich zu arbeiten.Editierbare Tabellenansicht an NSArrayController gebunden an NSUserDefaultsController
Wenn meine Anwendung startet, registriere ich mit NSUserDefaults
ein verschlüsseltes Archiv eines Arrays von Foo
's. In meinem XIB habe ich einen Array-Controller, dessen Inhalts-Array an den Controller-Schlüssel values
des freigegebenen Benutzer-Standard-Controllers gebunden ist; mit einem Schlüsselpfad von foos
; 'Behandelt Inhalt als Verbindungswert' markiert; und NSKeyedUnarchiveFromData
als der Wertwandler. Die Tabellenansicht wird dann wiederum an den Array-Controller und die Spalten der Tabelle an die Eigenschaften Foo
gebunden.
Dies funktioniert einwandfrei, wenn Foo
hinzugefügt und aus dem Array entfernt werden - der Schlüssel foos
in Benutzerstandards wird aktualisiert, um den neuen Inhalt des Arrays widerzuspiegeln. Das Problem besteht darin, dass Änderungen an den Eigenschaften einer Person Foo
nicht in ähnlicher Weise auslösen, dass das Array in Benutzerstandards zurückgeschrieben wird. Ich glaube, der Grund dafür wird im Abschnitt "Registrieren von abhängigen Schlüsseln" im Schlüsselwertbeobachtungs-Programmierleitfaden unter "To-many Relationships" diskutiert: Änderungen am Array-Controller des Array-Controllers selbst werden beobachtet, aber nicht an den Eigenschaften der enthaltenen Elemente .
Obwohl ich dies als das Problem anerkenne, kann ich nicht für das Leben von mir herausfinden, was ich tun soll, um das funktionieren zu lassen. Wenn ich eine Änderung an einem Foo
beobachte, welches Objekt muss ich informieren und mit welcher Nachricht, so dass das gesamte Array zurück auf Benutzerstandards geschrieben wird - NSUserDefaults
, NSUserDefaultsController
, NSArrayController
? Ich wünschte, die Apple-Dokumentation hätte dieses Problem mehr als nur oberflächlich erwähnt und einige tatsächliche Beispielcodes zur Verfügung gestellt, um es zu lösen - ich habe alles versucht und kann die magische Beschwörung nicht finden.
Dies ist ähnlich wie How to get notified of changes to models via an NSArrayController, aber ich kann nicht den konzeptionellen Sprung zwischen dem, was er mit einer benutzerdefinierten Ansicht macht und der Verwendung von bind:toObject:withKeyPath:options:
machen.
Danke! :)
Das klingt wirklich wie ein Job für CoreData nicht NSUserDefaults. –
Können Sie es ausarbeiten? Wenn ich nur über die Menge an Dokumentation nachdenke, die ich verdauen müsste, um diese sogar mit CoreData zu implementieren, bereitet mir das Kopfschmerzen. Aus der Sicht des Datenmodells scheint das, was ich versuche, extrem einfach zu sein - angesichts der Komplexität von CoreData erscheint es hier als Overkill. –
Nun Benutzer Standardeinstellungen sind für die Einstellung und Sie versuchen, es zu verwenden, um Ihr Datenmodell aus dem Sound davon zu speichern. CoreData ist wirklich nicht sehr schwierig, wenn Sie wirklich ein einfaches Datenmodell haben. xcode hat Projektvorlagen für Sie, die im Prinzip alle Einstellungen für Sie vornehmen. Es sollte das von Ihnen beschriebene Problem lösen. –