2010-02-16 21 views
8

In meiner App kann ein Benutzer bestimmte Elemente wie z. B. Lautstärkeregler und UIImage-Ansichten ziehen. Mein Ziel ist es, in der Lage zu sein, die Positionen der Elemente zu speichern, damit der Benutzer die Elemente nach dem Neustart nicht erneut ziehen muss. Leider habe ich Fehler gesehen entlang der Route CGRect rect = item.frame bis NSuserDefaults oder NSKeyedArchiver Route. Irgendwelche anderen Vorschläge?NSKeyedArchiver/NSuserDefaults - Speichern eines CGRect

Antwort

11

Wenn Sie eine verschlüsselte Archivierung auf dem iPhone verwenden, unterstützt UIKit speziell einen Zusatz, der wie folgt aussieht: -encodeCGRect:forKey: und macht genau das, was Sie wollen. Siehe die Apple-Dokumentation für NSCoder's UIKit additions.

Wenn Sie NSUserDefaults verwenden, erhalten Sie nicht den Luxus, einen expliziten Encoder für CGRects zu verwenden, aber wie einige andere Antworten sagen, könnten Sie sie als Strings mit NSStringFromCGRect() und umgekehrt speichern.

0

würden Sie wahrscheinlich kodieren CGRectNSData verwenden und speichern Sie dann NSData Objekt mit NSUserDefaults oder NSKeyedArchiver.

Ich bin nicht sicher, welche Fehler genau beziehen Sie sich in Ihrer Frage, vielleicht mehr Erklärung benötigt?

-4

Sie müssen die Floats im CGRect in NSNumbers konvertieren und sie dann in ein Dictionary einfügen.

Wenn Sie brauchen viel CGRects zu speichern, empfehle ich ein wenig leichte Klasse mit den CGRect Elementen zu schaffen als archivierbar NSNumber Attribute. Erstellen Sie einen Initialisierer, der ein CGRect übernimmt. Dann schreibe schnelle NSCoder-Protokoll-Methoden, damit das gesamte Objekt archiviert werden kann

So können Sie schnell und einfach konvertieren, speichern und dann die CGRects abrufen.

+4

Ein Kommentar mit den Down-Checks wäre nett. Wenn nichts anderes, lässt es mich wissen, warum ich falsch liege. Ich nahm den Ansatz, dass der 'CGRect' als Zahlen gespeichert werden muss, damit sie als Zahlen manipuliert werden können. Wenn Sie eine große Menge von 'CGRect's aktiv verwalten müssen, spart eine Wrapper-Klasse viel Zeit und Mühe auf lange Sicht. – TechZen

16

Sie können NSStringFromgCGRect() und CGRectFromString() verwenden, um sie zu speichern.

Verwandte Themen