2014-07-27 5 views
0

NSMutableDictionary를 사용하여 3 개의 키/값 쌍을 보유하고 있습니다. 값은 NSNumber 형식의 bool입니다. 그럼 셀을 누르면 값이 YES에서 NO로 또는 그 반대로 변경되어 데이터를로드하는 테이블 뷰가 있습니다.NSMutableDictionary setValue : forKey가 때때로 실패합니다

이 셀을 눌렀을 때 값이 다음은 NSDictionary에 에서 값을 취할 I 시도 세 가지 방법 사전

NSMutableDictionary *modsDict; 
NSString *test = @"test"; 
NSString *test1 = @"test1"; 
NSString *test2 = @"test2"; 

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 

    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath]; 
    [tableView deselectRowAtIndexPath:indexPath animated:YES]; 

    NSString *key = [NSString stringWithFormat: @"%@", [[modsDict allKeys] objectAtIndex: indexPath.row]]; 

    if (cell.accessoryType == UITableViewCellAccessoryNone) { 
     //enable 
     cell.accessoryType = UITableViewCellAccessoryCheckmark; 
     [modsDict setValue: [NSNumber numberWithBool: 1] forKey: key]; 
    } 
    else { 
     cell.accessoryType = UITableViewCellAccessoryNone; 
     [modsDict setValue: [NSNumber numberWithBool: 0] forKey: key]; 
    } 

} 

-(void)viewDidLoad { 

    %orig; 

    modsDict = [[NSMutableDictionary alloc] init]; 
    [modsDict setObject: [NSNumber numberWithBool: 0] forKey:test]; 
    [modsDict setObject: [NSNumber numberWithBool: 0] forKey:test1]; 
    [modsDict setObject: [NSNumber numberWithBool: 0] forKey:test2]; 

    ... //init tableview 

} 

-(void)someMethodThatIHookTo { 
    NSNumber *val = [modsDict objectForKey: test2]; 
    if ([val boolValue] == YES) { 
     //do something 
    } 
    //this works for test and test1, but for test2 it crashed 

    bool lol = [[modsDict objectForKey: test2] boolValue]; 
    if (lol) { 
     //so something 
    } 
    else { 

    } 
    //else is always called 

    if ([[modsDict objectForKey: test2] boolValue]) { 
    } 
    else { } 
    //if statement always true, never goes to else 
} 

의 마지막 키/값 쌍을 제외하고, 올바르게 변경 될 것으로 보인다 NO/YES를 사용하면 NO가 사용 되더라도 YES로 반환되므로 [NSNumber numberWithBool : 0/1]을 수행하고 있습니다.

상관없이 나는 3 가지 방법에서 셀, 결과를 누르면 얼마나 많은 시간은이 같은 ...

가 어떻게이 문제를 해결할 수있다?

THEOS에서 mobilesubtrate를 사용하고 있습니다.

+1

표시되는 오류는 무엇입니까? – duci9y

+0

"NO/YES를 사용하면 NO가 사용 되더라도 YES로 반환되므로 [NSNumber numberWithBool : 0/1]을 수행하고 있습니다." - 당신이 Objective-C에 비교적 새로운 사람이라고 가정하는 것이 안전할까요? 이것은 단지 사실이 아닙니다. – Tommy

+1

지금 iOS 프로그래밍에 익숙하지 않다면, 지금 당장 탈옥구 개발에 들어갈 것이라고 충고합니다. 먼저 기본 사항을 지우십시오. – duci9y

답변

3

아마 설명서를 조금 더 세게 읽을 필요가 있다고 생각합니다.

여기 allKeys에 대한 설명서의 말씀입니다 :

토론
정의되지 않은 배열의 요소의 순서.

이 점을 염두에두고 다음과 같은 코드 조각이 어떤 결과를 가져올 것이라고 생각하십니까? 내가 사용하기 때문에 경우 NO/YES가 반환 등의 YES 경우에도 NO : 내가 [0/1의 NSNumber numberWithBool]를하고있는 중이 야

: 당신이 좋아하는 미신적 인 믿음을 발명하는 이유 아마

[[modsDict allKeys] objectAtIndex: indexPath.row] 

사용. 기록을 위해

:

  • 그냥 @YES@NO를 사용하는 관용적이다;
  • [NSNumber numberWithBool:NO]은 동일한 값의 숫자뿐만 아니라 NSNumber 부울과 관련된 특별한 경우로 인해 동일한 ID로 숫자를 반환합니다. YES/0이 아닌 경우.

코드에 대한 수정 프로그램은 정의되지 않은 순서로 무언가의 순서에 대한 가정을 중단하는 것입니다. 어쨌든 사전을 사용하는 이유가 불분명하기 때문에 배열을 사용하는 것이 좋습니다.

+0

[NSNumber numberWithBool : NO]를 사용했으며 결과는 1이었습니다. 나는 googled 이것을 발견했다. http://objectivistc.tumblr.com/post/8992822737/a-chocking-mystery-po-nsnumber-numberwithbool-no – junyi00

+0

그것은 Xcode가 더 이상 사용하지 않는 디버거 인 GDB에 대한 주석이다. 컴파일 된 코드에 영향을 미쳤다. – Tommy

관련 문제