Mon application implique qu'un utilisateur puisse faire glisser des éléments spécifiques tels que des curseurs de volume et des vues UIImage. Mon but est de pouvoir enregistrer les emplacements des éléments afin que l'utilisateur ne puisse plus faire glisser les éléments après la relance. Malheureusement, j'ai vu des erreurs en prenant la route 'save CGRect rect = item.frame
to NSuserDefaults
ou NSKeyedArchiver
'. D'autres suggestions?NSKeyedArchiver/NSuserDefaults - enregistrement d'un CGRect
Répondre
Si vous utilisez l'archivage à clé sur iPhone, UIKit prend spécifiquement en charge un ajout qui ressemble à ceci: -encodeCGRect:forKey:
et fait exactement ce que vous voulez. Voir les documents Apple pour NSCoder's UIKit additions. Si vous utilisez NSUserDefaults, vous n'avez pas le luxe d'utiliser un encodeur explicite pour les CGRects, mais comme le disent certaines réponses, vous pouvez les sauvegarder en tant que chaînes en utilisant NSStringFromCGRect()
et son inverse.
Vous auriez probablement encoder CGRect
en utilisant NSData
puis stocker objet NSData
en utilisant NSUserDefaults
ou NSKeyedArchiver
.
Je ne sais pas exactement à quelle erreur faites-vous référence dans votre question, peut-être que d'autres explications sont nécessaires?
Vous devez convertir les flottants dans le CGRect en NSNumbers, puis les placer dans un dictionnaire.
Si vous devez stocker beaucoup de CGRects, je recommande de créer une classe légère avec les éléments CGRect comme attributs NSNumber archivables. Créez un initialiseur qui prend un CGRect. Ensuite, écrivez des méthodes de protocole NSCoder rapides pour que l'objet entier puisse être archivé.
De cette façon, vous pouvez convertir, stocker et récupérer facilement et rapidement les CGRects.
Vous pouvez utiliser NSStringFromgCGRect() et CGRectFromString() pour les stocker.
Un commentaire avec les chutes serait agréable. Si rien d'autre, cela me permet de savoir pourquoi je me trompe. J'ai pris l'approche que le 'CGRect' doit être stocké sous forme de nombres afin qu'ils puissent être manipulés sous forme de nombres. Si vous avez besoin de gérer activement un grand nombre de 'CGRect's, une classe wrapper économise beaucoup de temps et d'efforts à long terme. – TechZen