2013-05-13 7 views
0

Je tente d'enregistrer un NSMutableArray avec NSUSerDefault, puis j'ouvre le tableau. Voici un code:NSMutableArray non enregistré NSUserDefault

-(IBAction)btnSave{  
Class *aClass = [[Class alloc]init];  
[email protected]"aaaxxx";  
[email protected]"hello"; 
[myArray addObject:aClass]; 
NSUserDefaults *arrayDefault=[NSUserDefaults standardUserDefaults]; 
[arrayDefault setObject:myArray forKey:@"savedArray"]; 
[arrayDefault synchronize]; 
} 

et

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    myArray=[[NSMutableArray alloc]init]; 

    NSMutableArray *savedArray=[[NSUserDefaults standardUserDefaults]objectForKey:@"savedArray"]; 
    if(savedArray!=NULL){ 
     myArray=savedArray; 
     [tableView reloadData]; 
    } 
    // Do any additional setup after loading the view from its nib. 
} 

quand je compile et quand je pousse le bouton, c'est ce que je lis sur la sortie du journal:

[NSUserDefaults setObject:forKey:]: Attempt to insert non-property value '(
    "<Class: 0x8452b40>" 
)' of class '__NSArrayM'. Note that dictionaries and arrays in property lists must also contain only property values 

et, évidemment, quand je rouvrir la vue le tableau n'est pas chargé. toute aide?

Répondre

3

NSUserDefaults permet seulement DataTypes Premitive d'être entreposer. si vous voulez stocker votre objet de classe personnalisée puis utilisez le code ci-dessous, pour plus de détails consulter ce IOS Documentation

//create an array with your custom class objects 

Class *aClass = [[Class alloc]init]; 
[email protected]"aaaxxx"; 
[email protected]"hello"; 

[myArray addObject:aClass]; 

//convert your array to `NSData` object using `NSKeyedArchiver`  
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:myArray]; 

//store it to `NSUserDefaults` 
[[NSUserDefaults standardUserDefaults] setObject:data forKey:@"myArray"]; 
[[NSUserDefaults standardUserDefaults] synchronize]; 

//convert your stored Object back to `NSData` using `NSKeyedUnarchiver`  
NSData *storedData = [[NSUserDefaults standardUserDefaults] objectForKey:@"myArray"]; 
NSArray *storedArr = [NSArray arrayWithArray:[NSKeyedUnarchiver unarchiveObjectWithData:storedData]]; 

NSLog(@"%@",storedArr[0]); 
+0

Ca marche !!! J'ai seulement changé une chose: sur "viewDidLoad" j'ai mis: si (storedData! = NULL) { myArray = [NSArray arrayWithArray: [NSKeyedUnarchiver unarchiveObjectWithData: données stockées]]; } – gabboSonc

+0

oui qui vérifie si un tableau est déjà stocké dans UserDefaults ou non. bon travail. –

+0

ok ça marche ... mais pas si bien. le problème est quand je veux ajouter un nouvel objet au tableau chargé. Quand je crée le nouvel objet et que je l'ajoute au tableau avec [myArray addObject: newObj] alors j'ai besoin de recharger le TableView et quand j'arrive à la partie de "cellForRowAtIndexPath": if (cell == nil) { \t \t \t \t [[NSBundle mainBundle] loadNibNamed: sLoadNibNamed propriétaire: self options: NULL]; \t \t cellule = [self typeNibLoadCell: aEquipaggio.idMembro]; \t} l'application va dans l'exception: [UITextFieldRoundedRectBackgroundView idMembro]: sélecteur non reconnu envoyé à l'instance – gabboSonc

0

Vous devez implémenter le protocole NSCoding dans votre objet de modèle Class. Il est nécessaire de sérialiser et de désérialiser les données non standard à NSUserDefaults.

Vous pouvez maintenant utiliser NSKeyedArchiver pour convertir l'objet en données et le stocker dans userDefaults. Utilisez NSKeyedUnarchiver pour convertir les données à l'objet par défaut.

//h file 
@interface Class : NSObject<NSCoding> 

@property (nonatomic, copy) NSString *idClass; 
@property (nonatomic, copy) NSString *nameClass; 


//m File 

- (void)encodeWithCoder:(NSCoder *)aCoder{ 

    [aCoder encodeObject:self.idClass forKey:@"IDClass"]; 
    [aCoder encodeObject:self.nameClass forKey:@"NameClass"]; 

} 

- (id)initWithCoder:(NSCoder *)aDecoder{ 

    self = [super init]; 

    if (self) { 
     self.idClass = [aDecoder decodeObjectForKey:@"IDClass"]; 
     self.nameClass = [aDecoder decodeObjectForKey:@"NameClass"]; 
    } 

    return self; 
} 

Après la mise en œuvre du NSCoding vous pouvez les archiver pour stocker des données dans userDefaults

//Saving array 
Class *aClass = [[Class alloc]init];  
[email protected]"aaaxxx";  
[email protected]"hello"; 

[myArray addObject:aClass]; 

NSData *data = [NSKeyedArchiver archivedDataWithRootObject:myArray]; 

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
[defaults setObject:data forKey:@"savedArray"]; 
[defaults synchronize]; 

//Retrieving 

NSData *data = [defaults objectForKey:@"savedArray"]; 
NSArray *array = [NSKeyedUnarchiver unarchiveObjectWithData:data]; 
+0

alors que puis-je faire? – gabboSonc

+0

même problème ... ne fonctionne pas – gabboSonc

+0

@gabboSonc Mis à jour Ma réponse. – Anupdas

0

d'abord vous implémentez NSCoding en vous classe d'objet. Le pour sauvegarder/charger la NSMutableArray de ces objets que vous pouvez faire:

- (void) loadArray { 
    //Loading the NSMutableArray 
    NSData *arrayData = [[NSUserDefaults standardUserDefaults] objectForKey:@"ArrayKey"]; 
    myArray = [NSKeyedUnarchiver arrayData]; 
} 

-(void) saveArray { 
    //Saving the NSMutableArray 
    NSData *arrayData = [NSKeyedArchiver archivedDataWithRootObject:myArray]; 
    [[NSUserDefaults standardUserDefaults] setObject:arrayData forKey:@"ArrayKey"]; 
    [[NSUserDefaults standardUserDefaults] synchronize]; 
} 

Pour plus d'informations, je vous suggère de regarder un tutoriel plus. Par exemple How to Save your App Data with NSCoding And NSFileManager de Ray Wenderlich est un bon.