18

안녕하세요, 식당 객체에서 4 자리리스트를 만들려고합니다. 내 레스토랑에는 다른 레스토랑 목록이 있습니다. 사용자가 선호하는 레스토랑을 추가 할 수 있기를 원합니다.이 코드는 다음과 같습니다. 작동하지 않음속성 값을 삽입하려고 시도했습니다. 목표 C

- (IBAction)toggleFav:(id)sender { 

    Restaurant *resto = [self restaure]; 

    NSMutableDictionary *dic = [[NSMutableDictionary alloc] init]; 
    [dic setObject:resto.price forKey:@"restoPrice"]; 
    [dic setObject:resto.restaurantId forKey:@"restaurantId"]; 
    [dic setObject:resto.restoAbout forKey:@"restoAbout"]; 
    [dic setObject:resto.restoAddress forKey:@"restoAddress"]; 
    [dic setObject:resto.restoBeverages forKey:@"restoBeverages"]; 
    [dic setObject:resto.restoCategory forKey:@"restoCategory"]; 
    [dic setObject:resto.restoEmail forKey:@"restoEmail"]; 
    [dic setObject:resto.restoLogo forKey:@"restoLogo"]; 
    [dic setObject:resto.restoName forKey:@"restoName"]; 
    [dic setObject:resto.restoPhone forKey:@"restoPhone"]; 
    [dic setObject:resto.restoCity forKey:@"restoCity"]; 

    NSArray *dicArray = [dic allKeys]; 


    if([sender isSelected]){ 
     //... 
     [sender setSelected:NO]; 
     NSMutableArray *array = [[[NSUserDefaults standardUserDefaults] objectForKey:@"restoName"] mutableCopy]; 
     [array removeObject:dicArray]; 
     [[NSUserDefaults standardUserDefaults] setObject:array forKey:@"restoName"]; 

    } else { 
     //... 
     [sender setSelected:YES]; 
     NSMutableArray *array = [[[NSUserDefaults standardUserDefaults] objectForKey:@"restoName"] mutableCopy]; 
     [array addObject:dicArray]; 
     [[NSUserDefaults standardUserDefaults] setObject:array forKey:@"restoName"]; 
     [[NSUserDefaults standardUserDefaults] synchronize]; 

     //NSLog(@"%@",[[NSUserDefaults standardUserDefaults] stringForKey:@"restoName"]); 
    } 
} 

'클래스'__NSCFArray '입니다. 속성 목록의 사전과 배열에는 속성 값만 포함해야합니다.

+2

당신의 사전 확인은 null 값 여부가? – Exploring

답변

17

NSUserDefaults에는 속성 목록 유형 (배열, 데이터, 문자열, 숫자, 날짜, 사전) 또는 URL 만 저장할 수 있습니다. 모델 개체를 모델 개체로 변환해야합니다.

+0

어떻게해야합니까? 미안합니다. – mavusane

+3

NSDictionary를 만들고 개체의 모든 속성을 그 안에 넣을 수 있습니다. 아니면 NSCoding을 구현할 수 있고 그것을 사용, 비슷한 (그것의 문서가 많이 있어야합니다 NSKeyedArchiver에 대한 NSCoding 그들을 찾을 수없는 경우 검색) –

+0

안녕하세요 친구가 내 코드를 볼 수 있지만 여전히 동일한 문제가 배열을 만들었습니다 , 이것을 시도하는 3 일을 믿을 수 없다 인코딩 방법을 사용하면 NSObject 을 넣을 위치가 확실하지 않습니다. 내 detailView 클래스가이 @interface를 구현하기 때문에 DetailViewController : UIViewController – mavusane

57

당신이 모든 사전 값은 속성 목록 유형은, 당신은 단순히있는 NSData로 사전을 변환 할 수 있습니다 보장에 대해 걱정하지 않으려면,

NSUserDefaults *def = [NSUserDefaults standardUserDefaults]; 
[def setObject:[NSKeyedArchiver archivedDataWithRootObject:self.myDictionary] forKey:@"MyData"]; 
[def synchronize]; 

그리고 샌드 박스에서 사전에 돌아갈 :

NSUserDefaults *def = [NSUserDefaults standardUserDefaults]; 
NSData *data = [def objectForKey:@"MyData"]; 
NSDictionary *retrievedDictionary = [NSKeyedUnarchiver unarchiveObjectWithData:data]; 
self.myDictionary = [[NSDictionary alloc] initWithDictionary:retrievedDictionary]; 

희망이 있으면 도움이 될 것입니다. : D


추가 참고 : 변경 가능한 사전 또는 변경 가능한 배열을 받고 경우, "mutableCopy"방법을 사용해야합니다. 그렇지 않으면 검색된 사전/배열에서 객체를 추가하거나 삭제할 수 없습니다. 예를 들어 :

NSMutableDictionary *retrievedDictionary = 
[[NSKeyedUnarchiver unarchiveObjectWithData:data] mutableCopy]; 

또는

NSMutableArray *retrievedArray = 
[[NSKeyedUnarchiver unarchiveObjectWithData:data] mutableCopy]; 
+4

감사합니다. 이로 인해 두통이나 세 구해졌습니다. – mmr

+1

빠르고 간단한 솔루션입니다. 감사. – user3344977

+2

이것은 받아 들여야합니다 .. 고마워요 @ Rocotilos. – TamilKing