2013-07-19 2 views
0

사전에있는 'distance'키의 값을 업데이트 할 수 없습니다. 사전에 배열이 있습니다.이 배열은 json에서 읽은 사전으로 구성되어 있습니다. 앱에서 모든 거리 값을 업데이트해야합니다. , 어떻게하면됩니까? 샘플 코드로 알려주십시오. 나는이 배열 만들 경우 여기사전에있는 키에 대한 업데이트 값

입니다 : 여기

NSData *responseData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&err]; 
    self.seachResult =[NSJSONSerialization JSONObjectWithData:responseData options:nil error:nil]; 

과이다 그것에 샘플 정보 :이 시도했지만 심지어 내가 같은 간단한 사전에 대한 값을 업데이트 할 수 없습니다 테스트

2013-07-20 00:04:41.753 MyApp[61075:16a03] sorted array of dictionaries: (
    { 
    cid = 2; 
    distance = 0; 
    image = "http://images.png"; 
    latitude = "48.245565"; 
    longitude = "16.342333"; 
    manual = ""; 
    movie = "http://jplayer.org/video/m4v/Big_Buck_Bunny_Trailer.m4v"; 
    pcode = 023942435228; 
    pid = 1; 
    pname = "example product"; 
    price = "12.00"; 
    qrcode = ""; 
    rid = 1; 
    rname = "Example Retailer Name"; 
    sale = 0; 
    "sale_percent" = 0; 
    "sale_price" = "0.00"; 
    text = "here is text about sample product number 1...\nasdasdasda\nsdfsdfsd\nSdfsdf 
}, 
    { 
    cid = 1; 
    distance = 0; 
    image = ""; 
    latitude = ""; 
    longitude = ""; 
    manual = ""; 
    movie = ""; 
    pcode = 1; 
    pid = 3; 
    pname = "test product"; 
    price = "46.00"; 
    qrcode = ""; 
    rid = 2; 
    rname = ""; 
    sale = 0; 
    "sale_percent" = 0; 
    "sale_price" = "35.00"; 
    text = "some text here... 

}, 
    { 
    cid = 2; 
    distance = 0; 
    image = "httpestImage"; 
    latitude = "48.245565"; 
    longitude = "16.342333"; 
    manual = ""; 
    movie = ""; 
    pcode = 1; 
    pid = 2; 
    pname = "sample product 2"; 
    price = "126.00"; 
    qrcode = ""; 
    rid = 1; 
    rname = "Example Retailer Name"; 
    sale = 1; 
    "sale_percent" = 20; 
    "sale_price" = "99.99"; 
    text = "here is text about sample product number 2...\nblah blah blah\nasdasdasd\nASdasdas\nASdasdasd"; 
} 
) 

:

NSMutableDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys: 
         @"value1", @"key1", @"value2", @"key2", nil]; 
[dict setValue:@"test" forKey:@"key2"]; 

오류 :

2013-07-20 00 : 46 : 08.086 NSdictionaryTest [61130 : 11303] * 캐치되지 않은 예외 'NSUnknownKeyException'로 인해 앱 종료 중, 이유 : '[< __NSDictionaryI 0x7556390> setValue : forUndefinedKey :] :이 클래스는 키 값이 아닙니다. 키 2에 대한 코딩 호환. ' * 먼저 던져 호출 스택 : (0xf31c7 0xf3232 0x423d5 0x4276f 0x42905 0x4b917 0xf96c 0x1094b 0x21cb5 0x22beb 0x14698 0x1bebdf9 0x1bebad0 0x1c05bf5 0x1c05962 0x1c36bb6 0x1c35f44 0x1c35e1b 0x1017a 0x11ffc 0x1e5d 0x1d85이 0x1c90012 0x10cde7e 0x1d18fb1 0xb79e41 0xafb5f8 0xafb0e7 0x2200) 의 libC++ abi.dylib가 을 : 호출 종료 예외를 던지기

+1

NSMutableDictionary * dict를 불변의 것으로 초기화하고 있습니다. 이 작동해야 NSMutableDictionary 딕셔너리 * = [NSMutableDictionary의 dictionaryWithObjectsAndKeys을 : 를 "VALUE1"@ "KEY1"@ "값 2"@ "키 2"@ 닐]; [사전 설정 값 : @ "test"forKey : @ "key2"]; – Silenteh

답변

2

JSONObjectWithData가 반환하는 사전을 수정하려면 NSJSONReadingMutableContainers 옵션을 사용하십시오. 이 메소드는 변경 가능한 컨테이너 클래스를 리턴합니다. 예 :

self.seachResult =[NSJSONSerialization JSONObjectWithData:responseData options:NSJSONReadingMutableContainers error:nil]; 
+0

'NSJSONReadingMutableContainers'에 대해 읽었지만 사용법을 모르겠습니다. 샘플 코드를 제공해 주시겠습니까? – John

+0

업데이트 된 답변보기 이를 JSONObjectWithData 호출에 대한 옵션으로 추가하십시오. –

+0

그것은 작동하지만 내 거리 값은 정수하지만 문제가 있는데 내가 그것을 업데이 트하려면 내가 말하는 오류가 'ARC와 함께 허용되지 않는 ID의 정수 변환'입니다. 어떻게 해결할 수 있습니까? [[self.seachResult objectAtIndex : 0] setValue : 23 forKey : @ "distance"]; – John

0

NSDictionary는 변경할 수 없습니다 (생성 된 후에는 변경할 수 없습니다). 대신 NSMutableDictionary를 살펴보십시오. BTW - NSDictionary에서 NSMutableDictionary를 만드는 것은 쉽습니다.

+0

NSDictionary에서 NSMutableDictionary를 만드는 방법을 샘플 코드로 알려주십시오. – John

+0

NSMutableDictionary * mutableDictionary = [[NSMutableDictionary alloc] initWithDictionary : 사전]; –

+0

또는 [myImmutableDictionary mutableCopy]; –

2

불변 사전을 사용해야하는 특별한 이유가 있습니까?

당신은이 NSMutableDictionary

내가 self.seachResult이있는 NSDictionary 추측, 당신은 단순히 NSMutableDictionary로 선언 할 수 있습니다 사용할 수 있습니다.

로 초기화 : 당신이 원하는 경우

NSMutableDictionary *mutableSearchResults = [NSMutableDictionary dictionaryWithCapacity:[self.seachResult count]]; 
[mutableSearchResults addEntriesFromDictionary: self.seachResult]; 
[self.seachResult setObject:YOUR_UPDATED_VALUE_HERE forKey:@"distance"]; 

과 : 또한 당신은 또한 새로운 NSMutableDictionary 생성하고이 같은 비 가변 하나의 항목으로 그것을 채울 수

self.seachResult = [NSMutableDictionary dictionaryWithCapacity:10]; 
[self.seachResult addEntriesFromDictionary: NSJSONSerialization JSONObjectWithData:responseData options:nil error:nil]]; 
[self.seachResult setObject:YOUR_UPDATED_VALUE_HERE forKey:@"distance"]; 

다시 불변의 것을 돌려 주면됩니다.

[mutableSearchResults copy]; 

나는 그것이 도움이되기를 바랍니다. 참고 사항 SO 편집기에서 코드를 입력하기 만하면 철자가 틀릴 수 있습니다.

+0

코드 주셔서 고마워, self.seachResult 내가 fr을 작동하도록 귀하의 코드를 수정하려고했지만 초보자가 할 수 없어, 당신이 코드를 업데이트하시기 바랍니다 수 self.seachResult 가정하지 배열을 사전에? ! 그리고 'dictionaryWithCapacity : 10'이라고 썼으나 항목 수는 검색어 및 json 데이터에 따라 다릅니다. – John

+0

[self.seachResult setObject : YOUR_UPDATED_VALUE_HERE forKey : @ "distance"]; 작동하지 않습니다. 업데이트 된 질문을 확인해주십시오. – John

+0

@ 존 죄송합니다, 자기를 알아 채지 못했습니다. 검색 결과는 배열이었습니다. NSDictionary는 필요에 따라 자동으로 크기를 늘립니다. 심지어 휴대 전화로 생각하면 예상 된 크기로 초기화하는 것이 더 좋으며 이제는 self.searchResult가 다음과 같이 초기화하는 것이 가장 좋습니다. self. seachResult = [NSMutableDictionary dictionaryWithCapacity : [self.seachResult count]]; 귀하의 의견에 따라 답변을 편집하겠습니다. – Silenteh

관련 문제