2014-12-08 2 views
0

NSUserDefaults에 문제가 있습니다. 처음으로 구현해야하므로 나와 함께 견뎌주십시오.NSUserDefaults를 사용하여 배열 저장하기

휴대 전화에 저장하려고하는 데이터는 내 앱의 장바구니에있는 객체 배열입니다. 장바구니에 추가 된 모든 항목을 표시하기 위해 내 장바구니 table view을로드하는 동일한 배열입니다.

배열에는 서로 다른 속성 (NSStringsNSNumbers : 제품 이름, 크기, 가격 등)을 가진 두 가지 종류의 개체가 있습니다. 누군가 내 배열에 plist에 넣을 속성이 너무 많아서 아무 것도 저장하지 않는 이유가 있음을 제안했습니다.

여기 내 코드입니다. singleton 메서드를 사용하고이 코드를 내 singleton 클래스에 삽입했습니다.

- (void)save 
{ 
    NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults]; 
    [userDefaults setObject:self.cartArray forKey:@"tableViewCartData"]; 
    [userDefaults synchronize]; 
    NSURL *plistURL = [[self documentsDirectory]URLByAppendingPathComponent:@"cartItems.plist"]; 
    [self.cartArray writeToURL:plistURL atomically:YES]; 
} 

-(void)load 
{ 
    NSURL *plistURL = [[self documentsDirectory]URLByAppendingPathComponent:@"cartItems.plist"]; 

    self.cartArray = [NSMutableArray arrayWithContentsOfURL:plistURL]; 
    if (self.cartArray == nil) 
    { 
     self.cartArray = [NSMutableArray new]; 
    } 
} 

-(NSURL *)documentsDirectory 
{ 
    NSFileManager *fileManager = [NSFileManager defaultManager]; 
    NSURL *url = [fileManager URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask].firstObject; 
    return url; 
} 

내 문서 디렉토리에서 plist를 볼 수 있습니다. 그러나 거기에는 아무것도 없습니다.

편집

난 그냥 내 로그에이 눈치

:

CityBicycleCompany [4239 : 249463] 형식에 대한 잘못된 속성 목록 : (200) (속성 목록 유형 'CFType'의 객체를 포함 할 수 없습니다) 2014-12-07 20 : 52 : 10.037 CityBicycleCompany [4239 : 249463] 비 속성 목록 개체 ( "")를 키 테이블의 NSUserDefaults/CFPreferences 값으로 설정하려고 시도했습니다 .ViewCartData

그것이 의미하는 것이 확실하지 않습니다. CFType이란 무엇입니까?

편집 여기서 2

순간에 self.cartArray의 PO이다 ("쇼핑 카트"에 하나의 오브젝트를 추가). ChosenAccessory는 사용자 정의 object 카트에 추가했습니다.

<__NSArrayM 0x79788380>(<ChosenAccessory: 0x796d1f80>) 
+0

의 당신 배열을 저장 당신이 NSUserDefaults에 저장하려면, 가변 NSArray를 – NullData

+0

@NullData있는 NSMutableArray –

+0

를 사용하는 방법입니다 귀하의 배열에있는 모든 plist 준수해야하며 뭔가가되지 않을 수도 있습니다. cartArray의 내용을 인쇄하여 질문에 추가 할 수 있습니까? –

답변

0

직접 NSUserDefaults에서 사용자 정의 객체를 포함하는 배열을 저장할 수 없습니다, 사과 문서 :있는 NSData,있는 NSString,의 NSNumber,있는 NSDate, NSArray를, 또는있는 NSDictionary : 기본 설정 값은 표준 프로퍼티리스트 오브젝트 유형 중 하나 여야합니다. a link

해결 방법은 맞춤 개체 용 코더/디코더를 제공하는 것입니다. 귀하의 항목 클래스 추가에 :

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

//for each attribute of your class that you need to store, (NSString, Date, NSNumber...) 

    [coder encodeObject:self.recordID forKey:@"recordID"];//NSNumber 
    [coder encodeObject:self.phone forKey:@"phone"];//NSString 
    [coder encodeObject:self.date forKey:@"date"];//nsdate 

} 

- (Item*)initWithCoder:(NSCoder *)decoder { 
    if (self == [super init]) { 
     self.recordID = [decoder decodeObjectForKey:@"recordID"]; 
     self.phone = [decoder decodeObjectForKey:@"phone"]; 
     self.date =[decoder decodeObjectForKey:@"date"]; 
    } 
    return self; 
} 

당신의 ViewController에서 여기에, 초기화하기 및 항목

-(void)initItems{ 

    self.itemsArray = [[NSMutableArray alloc]init]; 
    NSUserDefaults* preferences = [NSUserDefaults standardUserDefaults]; 

    NSString* savedItems = @"savedItems"; 

    if([preferences objectForKey: savedItems] == nil) 
    { 
//handle 

    } 
    else 
    { 
     NSMutableArray *archiveArray = [preferences objectForKey: savedItems]; 
     for (NSData* itemObj in archiveArray) { 
      Item *item = [NSKeyedUnarchiver unarchiveObjectWithData: itemObj]; 
      [self.itemsArray addObject:item]; 
     } 

    } 

} 


-(void)saveItemsArray{ 

    NSUserDefaults* preferences = [NSUserDefaults standardUserDefaults]; 

    NSString* savedItems = @"savedItems"; 

    NSMutableArray *archiveArray = [NSMutableArray arrayWithCapacity:[self.itemsArray count]]; 

    for (Item* item in self.itemsArray) { 
     NSData* itemObj = [NSKeyedArchiver archivedDataWithRootObject:item]; 
     [archiveArray addObject:itemObj]; 

    } 

    [preferences setObject:archiveArray forKey: savedItems]; 
    [preferences synchronize]; 

} 
관련 문제