2014-03-26 474 views
0

所以我在保存數組時遇到NSUserDefaults問題。我所有的代碼一直工作到這一點,但只要我試圖將數組保存在NSUserDefaults中,我開始出現問題,主要是因爲某些原因它現在不能保存。終止應用程序由於未捕獲的異常「NSInvalidArgumentException」,NSUserDefaults?

- (IBAction)unwindToList:(UIStoryboardSegue *)segue 
{ 

NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init]; 
[dateFormat setDateFormat:@"MMMM dd, yyyy"]; 

AG_AddItemViewController *source = [segue sourceViewController]; 
AG_Storage *item = source.store; 

NSDate *dateCreated = item.creationDate; 



NSString *todayString = [dateFormat stringFromDate:self.todayDate]; 
NSString *dateCreatedString = [dateFormat stringFromDate:dateCreated]; 
NSString *tomorrowString = [dateFormat stringFromDate:self.tomorrowsDate]; 
NSString *yesterdayString = [dateFormat stringFromDate:self.yesterdaysDate]; 


//Set up file storage! 

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 



if (item.itemName != nil) { 

    if ([dateCreatedString isEqualToString:todayString]) { 
     [self.mainArray addObject:item]; 
     [tableView reloadData]; 
     [defaults setObject:self.mainArray forKey:todayString]; 
     [defaults synchronize]; 

     NSLog(@"Saved"); 

    } 
    else if ([dateCreatedString isEqualToString:tomorrowString]){ 
     [self.tomorrowArray addObject:item]; 
     [tableView reloadData]; 

     NSLog(@"THIS WORKED TOO :D"); 
    } 
    else if ([dateCreatedString isEqualToString:yesterdayString]){ 
     [self.yesterdayArray addObject:item]; 
     [tableView reloadData]; 

     NSLog(@"THIS WORKED"); 
    } 
    else{ 

    } 
} 
} 

mainarray和其它可變陣列都聲明爲在接口屬性,所以他們不應該會造成這個問題。

2014-03-26 15:36:46.561 AgendaBk[32702:a0b] <AG_Storage: 0x8cc2c90> 
    2014-03-26 15:36:46.563 AgendaBk[32702:a0b] Attempt to set a non-property-list object  (
    "<AG_Storage: 0x8cc2c90>" 
    ) as an NSUserDefaults value for key March 26, 2014 
    2014-03-26 15:36:46.565 AgendaBk[32702:a0b] *** Terminating app due to uncaught exception   'NSInvalidArgumentException', reason: '*** -[NSUserDefaults setObject:forKey:]: attempt to insert non-property list object (
    "<AG_Storage: 0x8cc2c90>") for key March 26, 2014' 

libc++abi.dylib: terminating with uncaught exception of type NSException 

需要注意的是,當我試圖讓去NSUserDefaults的這個問題只發生。其他一切似乎都工作正常,並且當我之前添加單個字符串時它工作正常。我真的想用這個來存儲我的數組,儘管我可以管理它。

+0

http://stackoverflow.com/questions/10305659/not-sure-how-to-handle-terminating-app-due-to-uncaught-exception-nsinvalidargu –

回答

0

NSUserDefaults僅支持plist對象,因此您無法將自定義對象保存到其中。您正在向數組中添加一個AG_Storage類型的對象並將其保存,這是不允許的。您需要查看NSKeyedArchiving,而不是將AG_StorageNSCoding協議一致。讓我知道你是否需要更多的指導。

0

文檔說:

的類NSUserDefaults的提供用於訪問 常見類型如浮標方便的方法,雙打,整數,布爾值,和URL。一個 默認的對象必須是一個屬性列表,也就是一個實例(集合或 的實例的組合):NSData的,的NSString, 的NSNumber,NSDate的,NSArray的,或者NSDictionary的

但你試圖保存AG_Storage實例。如果你想存儲任何類型的對象,你應該嘗試序列化你的對象。例如要實現NSCoding協議。

+0

所以我應該做一個本地NSMutableArray的內容'mainarray'?這會解決它還是我會不得不在課堂上聲明所有這些信息來自? – user3430084

+0

不,所有的NSMutableArray對象必須是:NSData,NSString,NSNumber,NSDate實例。 – Krivoblotsky

+0

那麼我該如何去轉換它們呢?很抱歉,我對這些概念中的一些很陌生。我知道它不能存儲,因爲它是一個AG_Storage實例,但是如何設置數組以便我可以正確存儲它?還有另一種方法可以保存比這更容易的數據嗎?我將需要刪除這些信息 – user3430084

0

如果有人提出這個問題,請確保在您保存的項目中沒有null/nil,如果您嘗試保存空對象,則會引發異常。

相關問題