2012-04-09 117 views
0

我有兩個視圖控制器。第一個有一個segue到另一個視圖控制器。我希望爲後者的視圖控制器添加來自文本字段的項目,然後通過點擊按鈕將其保存在數組中。然後這個數組將被保存使用NSUserDefaults。如何保留一個數組的值

關於下面的代碼,我可以成功地將項目存儲在我的數組中。這個數組也使用NSUserDefaults保存。然而,當我回到我的第一個視圖控制器,然後再次繼續到我的第二個視圖控制器添加新的項目在我的數組,我以前存儲的項目已經消失。新增項目是唯一保存的項目。

建議,請在我的.m文件

@interface AddCardViewController() 

@property (nonatomic, strong)NSMutableArray *nameOfCards; 

@end 


@implementation AddCardViewController 

@synthesize cardNameTextField = _cardNameTextField; 

@synthesize nameOfCards = _nameOfCards; 


// setting my array 
- (NSMutableArray *)nameOfCards 
{ 
    if (!_nameOfCards) _nameOfCards = [[NSMutableArray alloc] init]; 

    return _nameOfCards; 
} 

- (void) viewWillAppear:(BOOL)animated{ 
    [super viewWillAppear:animated]; 

    self.cardNameTextField.delegate = self; 
} 


- (BOOL) textFieldShouldReturn:(UITextField *)textField{ 

    [self.cardNameTextField resignFirstResponder]; 

    return YES; 
} 

- (void)viewDidLoad 
{ 
    //getting the data saved 

    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 

    NSMutableArray *cardName = [defaults objectForKey:@"cardName"]; 

    NSLog(@"contents of my array %@", cardName); 

    [super viewDidLoad]; 

} 

- (IBAction)addNewCard:(id)sender { 
    [self.nameOfCards addObject:self.cardNameTextField.text]; 
    NSLog(@"contents :%@", _nameOfCards); 


    // this is how to save the data 

    NSMutableArray *cardName = _nameOfCards; 

    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 

    [defaults setObject:cardName forKey:@"cardName"]; 

    [defaults synchronize]; 

    NSLog(@"data saved"); 

} 


@end 
+0

無法直接「保存」對象數組。該數組只包含指針(地址)。如果你保存並重新加載它們,它們會有含糊不清的含義。你需要序列化它。根據數組或其他東西重建字符串。 – 2012-04-09 06:15:30

+0

爲保存數組值,最好使用plist而不是NSUserDefaults。 – vishy 2012-04-09 06:24:01

+0

@HeShiming感謝您的建議。我如何序列化數組?我對這種編程語言很陌生,所以我不太明白。 – Hans 2012-04-09 06:25:11

回答

0

如上面給出的代碼:)

在我.h文件中

@interface AddCardViewController : UIViewController <UITextFieldDelegate> 

@property (strong, nonatomic) IBOutlet UITextField *cardNameTextField; 

@end 

顯示你剛纔設置的新創建cardname對象我認爲你必須首先從nsuserdefaluts中獲取所有數據並將它們添加到_nameOfCards數組中,然後在addNewCard中添加新對象:(id)發件人方法 像

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 

NSMutableArray *cardName = [defaults objectForKey:@"cardName"]; 
self.nameOfCards = cardName; 

[self.nameOfCards addObject:self.cardNameTextField.text]; 

NSMutableArray *finalCardNames = [[NSMutableArray alloc] initWithArray:self.nameOfCards copyItems:YES]; 

[defaults setObject:finalCardNames forKey:@"cardName"]; 

[defaults synchronize]; 

我認爲這將解決您的問題 嘗試 有美好的一天從NSUserDefaults檢索

+0

我試過這段代碼,但編譯器給我一個錯誤:( – Hans 2012-04-09 09:40:18

+0

哪種類型的錯誤? – 2012-04-09 09:42:00

+0

你建議的代碼在保存的數組中添加了一個新項目,但是下一次我再次添加一個新項目時,應用程序崩潰, ***由於未捕獲異常'NSInternalInconsistencyException',原因:' - [__ NSCFArray insertObject:atIndex:]:發送到不可變對象的變異方法' – Hans 2012-04-10 01:45:11

2

對象總是一成不變的,即使你設置了可變對象的關鍵。您可以將其視爲NSUserDefaults製作副本。

如果您需要基於存儲在NSUserDefaults中的內容的可變對象,請製作一個可變副本。例如:

NSMutableArray *cardName = [[[defaults objectForKey:@"cardName"] mutableCopy] autorelease]; 
0

由於您可以編輯,添加和刪除NSMutableArray中的元素,因此使用NSMutableArray比NSArray更好。希望這可以幫助。

相關問題