2013-11-27 197 views
1

我有一個NSMutableArray在我的AppDelegate裏面,我試圖將它保存到NSUserDefaultsNSMutableArray(菌株最終)包含一個收藏項列表。我希望這個列表保存,即使應用程序關閉,然後重新啓動,它也會存在。有誰知道爲什麼我的代碼不工作(不保存我的數據)?請看下圖:保存NSMutableArray爲NSUserDefaults

AppDelegate.m

-(void)updateStrains:(NSDictionary *)item 
{   
    NSUserDefaults *currentDefaults = [NSUserDefaults standardUserDefaults]; 
    NSData *dataSave = [currentDefaults objectForKey:@"strains"]; 
    if (strainsfinal != nil) 
    { 
     NSArray *oldSavedArray = [NSKeyedUnarchiver unarchiveObjectWithData:dataSave]; 
     if (oldSavedArray != nil) 
      strainsfinal = [[NSMutableArray alloc] initWithArray:oldSavedArray]; 
     else 
      strainsfinal = [[NSMutableArray alloc] init]; 
    } 

} 

編輯:Appdelegate.m所以我改變了我上面的方法下面的方法(我認爲它應該工作),但應用程序崩潰了,他說:「終止應用程序由於未捕獲的異常‘NSInvalidArguementException’,理由是:「NSConcreteAttributedString initwithString:無‘值’

我缺少什麼?

-(void)updateStrains:(NSDictionary *)item { 

    NSData *dataSave = [NSKeyedArchiver archivedDataWithRootObject:strainsfinal]; 
     [[NSUserDefaults standardUserDefaults] setObject:dataSave forKey:@"strains"]; 
     NSNotificationCenter* nc = [NSNotificationCenter defaultCenter]; 
     [nc postNotificationName:@"arrayupdated" object:self userInfo:nil]; 
     NSLog(@"updated strains %@",strainsfinal); 
} 

回答

6

您必須添加

[currentDefaults synchronize]; 

每次保存的東西userDefaults後的時間;

但是對於這種類型的數據最好使用.plist文件。 檢查documentation瞭解更多信息。

編輯的代碼:

-(void)updateStrains:(NSDictionary *)item { 
    NSData *dataSave = [NSKeyedArchiver archivedDataWithRootObject:item[@"strainsfinal"]]; 
    [[NSUserDefaults standardUserDefaults] setObject:dataSave forKey:@"strains"]; 
    // NSNotificationCenter* nc = [NSNotificationCenter defaultCenter]; 
    // [nc postNotificationName:@"arrayupdated" object:self userInfo:nil]; 
    NSLog(@"updated strains %@",strainsfinal); 
    [[NSUserDefaults standardUserDefaults] synchronize]; // this will save you UserDefaults 
} 
+1

這並沒有爲我工作...:/ – Brittany

+0

@Brittany究竟沒有工作爲你 ? –

+0

我加了[currentDefaults synchronize];到我的方法結束,它不保存。你的意思是什麼,「每次你節省了什麼」?你能告訴我代碼是什麼樣子嗎?謝謝! – Brittany

-1

你應該保存之前存檔NSArray

[[NSUserDefaults standardUserDefaults] 
    setObject:[NSKeyedArchiver archivedDataWithRootObject:yourArray] 
    forKey:@"yourArray"]; 

NSUserDefaults得到並取消存檔。

NSData *data = [currentDefaults objectForKey:@"yourArray"]; 
if (data != nil) 
{ 
    NSArray *savedArray = [NSKeyedUnarchiver unarchiveObjectWithData:data]; 
} 
+0

查看我上面的編輯。我將數組歸檔,並且應用程序崩潰(請參閱上面的錯誤)。我錯過了什麼?大聲笑 – Brittany

+0

OP,你展示瞭如何保存NSArray而不是NSMutableArray,因爲問題的建議 –

2

使用下面的方法:

NSUserDefaults *userDef = [NSUserDefaults standardUserDefaults]; 
[userDef setObject:array1 forKey:@"DataArra1"]; 
[userDef setObject:array2 forKey:@"DataArr2"]; 
[userDef synchronize]; 

檢索信息:

NSUserDefaults *userDef = [NSUserDefaults standardUserDefaults]; 
NSArray *arrayText2 = [userDef objectForKey:@"DataArra1"]; 
NSArray *arrayText1 = [userDef objectForKey:@"DataArr2"]; 
相關問題