2014-07-27 45 views
0

我正在使用NSMutableDictionary來保存3個鍵/值對。該值是以NSNumber的形式布爾值。 然後我有一個表格視圖加載數據,如果單元格被按下,值從YES更改爲NO,反之亦然。NSMutableDictionary setValue:forKey有時失敗

看來,按下電池,當值被正確地改變,除了在字典

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 
} 

的最後一個鍵/值對這些是三種方式我試圖從NSDictionary中 取值我正在做[NSNumber numberWithBool:0/1],因爲如果我使用NO/YES,即使使用NO,它也會返回YES。

不管我有多少時間按下電池,從3種方式 的結果是一樣的...

我怎樣才能解決這個問題?

請注意,我正在使用THEOS,mobilesubtrate作爲一個調整。

+1

你看到什麼錯誤? – duci9y

+0

「我正在做[NSNumber numberWithBool:0/1],因爲如果我使用NO/YES,即使使用NO,它也會返回YES。」 - 假設你對Objective-C比較陌生嗎?事實並非如此。 – Tommy

+1

你現在不太熟悉iOS編程,我現在建議不要進入越獄開發。首先清理你的基礎知識。 – duci9y

回答

3

我想也許你需要閱讀文檔有點困難。

這裏是什麼allKeys的文件說:

討論
數組中元素的順序沒有定義。

考慮到這一點,您認爲您的代碼中的以下片段會產生什麼結果?

[[modsDict allKeys] objectAtIndex: indexPath.row] 

這可能是爲什麼你發明了迷信思想,如:

我做[NSNumber的numberWithBool:0/1]因爲如果我使用NO/YES它將返回爲YES,即使沒有用來。

爲了記錄在案:

  • 它慣用的只是使用@YES@NO;
  • [NSNumber numberWithBool:0][NSNumber numberWithBool:NO]不僅會返回相同數值的數字,而且會返回具有完全相同身份的數字,這是由於與布爾值有關的特殊情況。同上YES /非零。

您的代碼的修復是停止對未定義順序的東西的順序做出假設。可能只是使用一個數組,因爲不清楚爲什麼你要使用字典。

+0

我使用了[NSNumber numberWithBool:NO],結果是1.然後。我GOOGLE了,發現這個http://objectivistc.tumblr.com/post/8992822737/a-chocking-mystery-po-nsnumber-numberwithbool-no – junyi00

+0

這是一個關於GDB的評論,Xcode不再使用的調試器,以及從不對編譯代碼有任何影響。 – Tommy