Ich habe ein einfaches Modell Foo
, das eine Benutzerpräferenz darstellt und ein NSString
und ein NSNumber
einkapselt. Ich möchte ein Array von Foo
in Benutzerstandardwerten speichern, so dass sie zwischen den Starts der Anwendung erhalten bleiben. und ich möchte sie in einer Tabellenansicht anzeigen, sodass der Benutzer sie hinzufügen, entfernen und bearbeiten kann. Die Lösung dazu schien mit Bindings ziemlich einfach zu sein, aber es ist mir unmöglich, tatsächlich zu arbeiten.
Beim Start meiner Anwendung registriere ich mich mit NSUserDefaults
einem verschlüsselten Archiv eines Arrays von initialen Foo
s. In meinem XIB habe ich einen Array-Controller, dessen Content-Array an den Controller-Schlüssel values
des freigegebenen Benutzer-Standards gebunden ist. mit einem Schlüsselpfad von foos
; 'Behandelt Inhalt als Verbindungswert' markiert; und NSKeyedUnarchiveFromData
als Wertwandler. Die Tabellenansicht ist dann wiederum an den Array-Controller und die Spalten der Tabelle an die Eigenschaften von Foo
gebunden.
Dies funktioniert perfekt, wenn Foo
hinzugefügt und aus dem Array entfernt werden - der Schlüssel foos
in den Benutzerstandards wird aktualisiert, um den neuen Inhalt des Arrays wiederzugeben. Das Problem besteht darin, dass Änderungen an den Eigenschaften eines einzelnen Foo
das Array nicht in ähnlicher Weise zum Zurückschreiben auf Benutzerstandards veranlassen. Ich glaube, der Grund dafür wird in der ' Zu viele Beziehungen " im Abschnitt "Registrieren abhängiger Schlüssel" im Handbuch zur Programmierung der Schlüsselwertbeobachtung: Änderungen am Array-Controller des Array-Controllers werden beobachtet, aber es werden Eigenschaften der enthaltenen Elemente geändert sind nicht.
Obwohl ich dies als Problem erkannt habe, kann ich nicht für das Leben von mir herausfinden, was ich tun soll, um dies zu erreichen. Wenn ich eine Änderung an einem Foo
beobachte, welches Objekt muss ich informieren und mit welcher Nachricht, so dass das gesamte Array in die Benutzervorgaben zurückgeschrieben 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 ich kann die magische Beschwörung nicht finden.
Dies ist ähnlich wie über Änderungen an Modellen über einen NSArrayController benachrichtigt werden , 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! :)
Ich bin ein iOS-Entwickler, also vergib mir, wenn es einen Aspekt davon gibt, den ich vermisse, weil iOS keine Cocoa-Bindungen unterstützt.
Ich konnte es nicht genau sagen, aber es klingt so, als ob Sie eine Benachrichtigung erhalten möchten, wenn eine Eigenschaft eines Foo geändert wird, so dass Sie eine Änderung an Ihrem foos-Array signalisieren können und NSUserDefaults das gespeicherte Array aktualisieren kann. Ist das richtig?
Ich nehme an, ich verstehe das Szenario, und wenn man bedenkt, dass das Modifizieren des Arrays selbst (dh das Hinzufügen / Entfernen von Foo's "foos") erfolgreich die Änderung signalisiert, scheint es offensichtlich, dass Sie das signalisieren müssen foos wurde jedes Mal aktualisiert, wenn eine einzelne Eigenschaft aktualisiert wird.
Dazu müssen Sie lediglich eine KVO-Benachrichtigung auslösen, wenn sich eine Eigenschaft ändert. Grundsätzlich würden Sie Ihre Setter in Foo überschreiben - für alle Eigenschaften, die Sie beobachten möchten. Und senden Sie eine Benachrichtigung dort.
Aber wie machst du das? Das übliche Muster zum Senden einer KVO-Benachrichtigung lautet wie folgt (für eine Eigenschaft namens openingBalance:
%Vor%Aber in Ihrem Fall möchten Sie eine Benachrichtigung senden, dass die Eigenschaft "foos" geändert hat. Und es ist keine Eigenschaft auf Foo. Es gibt nichts, das besagt, dass die Benachrichtigung nur für die spezifische Eigenschaft (oder zumindest nichts, was mir bekannt ist) sein muss. Aber Sie wollen wahrscheinlich nicht, dass ein Foo weiß, dass er irgendwo in einer "Foos" -Eigenschaft komponiert ist.
Also, wie wäre es mit einer geraden NSNotification? Erstellen Sie eine generische Methode, um eine "Foo" -aktualisierte Benachrichtigung innerhalb der Foo-Unterklasse zu erstellen und anschließend diese Benachrichtigung auszulösen, wenn Sie eine Foo-Eigenschaft ändern.
Im Gegenzug abonnieren Sie in Ihrem Objekt, das 'foos' besitzt, diese Benachrichtigung und entweder NSUserDefaults direkt aktualisieren oder von dort aus Ihre KVO-Benachrichtigungen für 'foos' dort auslösen.
Tags und Links objective-c cocoa nsuserdefaults cocoa-bindings nsarraycontroller