La mia app prevede che un utente possa trascinare elementi specifici come slider del volume e viste UIImage. Il mio obiettivo è essere in grado di salvare le posizioni degli oggetti in modo che l'utente non possa dover trascinare di nuovo gli elementi dopo il riavvio. Sfortunatamente, ho visto errori lungo il percorso "salva CGRect rect = item.frame
su " o "NSKeyedArchiver
". Qualche altro suggerimento?NSKeyedArchiver/NSuserDefaults - salvataggio di CGRect
risposta
Se si utilizza l'archiviazione con chiave su iPhone, UIKit supporta in modo specifico un'aggiunta simile a questa: -encodeCGRect:forKey:
e fa esattamente ciò che si desidera. Consulta i documenti Apple per NSCoder's UIKit additions.
Se stai usando NSUserDefaults, non si ottiene il lusso di usare un encoder esplicita per CGRects, ma come dicono alcune altre risposte, si potrebbe risparmiare loro come stringhe utilizzando NSStringFromCGRect()
e il suo contrario.
Si sarebbe probabilmente codificare CGRect
utilizzando NSData
e quindi memorizzare NSData
oggetto utilizzando NSUserDefaults
o NSKeyedArchiver
.
Non sono sicuro di quali errori si riferiscono esattamente alla domanda, forse sono necessarie ulteriori spiegazioni?
Devi convertire i float in CGRect in NSNumbers e inserirli in un dizionario.
Se è necessario memorizzare molti CGRects, è consigliabile creare una classe leggera con gli elementi CGRect come attributi NSNumber archiviabili. Crea un inizializzatore che accetta un CGRect. Quindi scrivi rapidamente i metodi del protocollo NSCoder in modo che l'intero oggetto possa essere archiviato
In questo modo è possibile convertire, archiviare e recuperare i CGRect in modo facile e veloce.
È possibile utilizzare NSStringFromgCGRect() e CGRectFromString() per memorizzarli.
Un commento con i controlli in basso sarebbe bello. Se non altro, mi fa capire perché mi sbaglio. Ho preso l'approccio che il 'CGRect' ha bisogno di essere memorizzato come numeri in modo che possano essere manipolati come numeri. Se è necessario gestire attivamente un ampio set di 'CGRect's, una classe wrapper risparmia molto tempo e fatica a lungo termine. – TechZen