Vous ne pouvez pas utiliser NSUserDefaults
pour une classe personnalisée. De la documentation:
La classe NSUserDefaults
fournit des méthodes pratiques pour accéder à types communs tels que flotteurs, doubles, entiers, booléens et URL. Un objet par défaut doit être une liste de propriétés, qui est une instance de (ou pour les collections d'une combinaison d'instances de): NSData
, NSString
, NSNumber
, NSDate
, NSArray
ou NSDictionary
. Si vous souhaitez stocker un autre type d'objet, vous devez généralement l'archiver pour créer une instance de NSData
.
Essayez d'utiliser NSData
. Par exemple, pour charger des objets personnalisés dans un tableau, vous pouvez faire
NSUserDefaults *currentDefaults = [NSUserDefaults standardUserDefaults];
NSData *dataRepresentingSavedArray = [currentDefaults objectForKey:@"savedArray"];
if (dataRepresentingSavedArray != nil)
{
NSArray *oldSavedArray = [NSKeyedUnarchiver unarchiveObjectWithData:dataRepresentingSavedArray];
if (oldSavedArray != nil)
objectArray = [[NSMutableArray alloc] initWithArray:oldSavedArray];
else
objectArray = [[NSMutableArray alloc] init];
}
Pour archiver les données, utilisez:
[[NSUserDefaults standardUserDefaults] setObject:[NSKeyedArchiver archivedDataWithRootObject:objectArray] forKey:@"savedArray"];
Ce sera tout le travail aussi longtemps que votre objet personnalisé conforme au protocole NSCoding
:
- (void)encodeWithCoder:(NSCoder *)coder;
{
[coder encodeObject:label forKey:@"label"];
[coder encodeInteger:numberID forKey:@"numberID"];
}
- (id)initWithCoder:(NSCoder *)coder;
{
self = [[CustomObject alloc] init];
if (self != nil)
{
label = [coder decodeObjectForKey:@"label"];
numberID = [coder decodeIntegerForKey:@"numberID"];
}
return self;
}
ABRecord
est un type opaque C, il est donc pas un objet dans le sens de l'Objective-C. Cela signifie que vous ne pouvez pas l'étendre, vous ne pouvez pas ajouter une catégorie, vous ne pouvez pas le signaler. La seule chose que vous pouvez faire est d'appeler les fonctions décrites dans ABRecord
Référence avec le ABRecord
en tant que paramètre.
Vous pouvez faire deux choses pour être en mesure de garder l'information référencée par la ABRecord
autour de:
Obtenez le ABRecord
s id
par ABRecordGetRecordID()
. Le ABRecordID
est défini comme int32_t, vous pouvez donc le convertir en NSInteger
et le stocker où vous le souhaitez. Vous pouvez plus tard récupérer l'enregistrement de ABAddressBookGetPersonWithRecordID()
ou ABAddressBookGetGroupWithRecordID()
. Cependant, l'enregistrement pourrait être modifié ou même supprimé par l'utilisateur ou une autre application en attendant.
Copiez toutes les valeurs de l'enregistrement dans une sous-classe NSObject
standard et utilisez NSCoding
comme indiqué ci-dessus pour le stocker. Bien entendu, vous ne bénéficierez pas des modifications ou des ajouts apportés à l'enregistrement que l'utilisateur aurait pu effectuer.
Mais je ne peux pas encoder ABRecordRef parce que ce n'est pas un objet. – CodeGuy
droite, j'ai fait tout cela. mais comment puis-je encoder ABRecordRef – CodeGuy
@ reising1: Voir ci-dessus. – PengOne