1

希望有人能幫助我與獲取一個NSDictionary:通過過濾另一個NSDictionary的

我使用的是NSDictionary填充UITableView。 它的模型就像[key:userID => value:userName]。 tableView只填充了userName,但點擊後,它必須發送相關的userID。 問題出現在我想過濾UITable時。我只找到了通過將它轉換爲NSArray(使用謂詞)來過濾字典的方法,但它使我鬆散了userNames和userID之間的關係。

一個解決方案是過濾最初的NSDictionary以獲得過濾NSDictionary(仍然是關係鍵/值),但我不知道該怎麼做。我只找到獲得陣列的解決方案。

我該怎麼做,還是有更好的解決方案呢?

回答

1

有一個更好的解決方案,弗朗索瓦。 創建,從NSDictionary(我將在這裏稱之爲myDictionary),一個NSArray像這樣(聲明它在你的接口文件):

NSArray *arrayForTableView; 

然後,您加載的NSDictionary剛過,請執行下列操作:

現在
arrayForTableView = [myDictionary allKeys]; // so you will have an array of all UserID's 

,在你tableView: cellForRowAtIndexPath:方法,你可以像這樣做:

cell.textLabel.text = [myDictionary objectForKey:[arraForTableView objectAtIndex:indexPath.row]]; 

然後,當喲U將要傳遞的用戶ID,當用戶選擇該小區,在你tableView: didSelectRowAtIndexPath:你只是做這樣說:

id userIDSelected = [arraForTableView objectAtIndex:indexPath.row]; 

然後,當你要根據搜索的陣列來篩選,你可以簡單地重新創建arrayForTableView,通過「掃描」你的NSDictionary這樣:

NSString *typedString; 
NSMutableArray *arrayFiltered = [NSMutableArray array]; 
for (int i = 0; i < [[myDictionary allKeys] count]; i++) 
{ 
    if ([[myDictionary objectForKey:[[myDictionary allKeys] objectAtIndex:i]] rangeOfString:typedString].location != NSNotFound) 
    { 
     [arrayFiltered addObject:[[myDictionary allKeys] objectAtIndex:i]]; 
    } 
} 

arrayForTableView = arrayFiltered; 

這樣,你甚至不需要改變你的UITableView數據源和委託方法。

+0

好的,我明白了你的觀點。我從錯誤的方面解決了問題,並且我被相同價值觀的非問題所打擾。謝謝你的幫助。 – 2013-04-28 10:55:04

+0

我很高興我的幫助。如果它解決了你的問題,也請投票:) – 2013-04-28 10:57:43

+0

還沒有足夠的聲望做到這一點,但我會:) – 2013-04-28 11:06:21

0

你可以做下面以獲取選定的密鑰(用戶名)值(用戶ID):

//iterate through whole dictionary 
for(id key in yourNSDictionary) 
{ 
    // if key is the userName clicked 
    if([key isEqualToString:selectedUserName]) 
    { 
     //userID for clicked userName 
     int userID = [yourNSDictionary objectForKey:@selectedUserName]; 
    } 
} 
0

你使用一個NSDictionary來填充的UITableView這UITableView的只是充滿了你的用戶名通過做

[dictionary [email protected]"userID"]; 

一個NSDictionary中有兩個功能allkeys和allValues

NSArray* allUserID = [dictionary allKeys]; 
NSArray* allUserNames = [dictionary allValues]; 

這是一個並行數組,因此一個數組的索引與其相關數組並行運行。

表格單元格的每個單元格也可以是一個自定義類,它擁有對它自己的id和用戶名的引用,這將允許您僅傳遞單元格並獲取其數據。

可以閱讀有關的NSDictionary文檔中的那些功能

https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSDictionary_Class/Reference/Reference.html

+0

我同意這兩個allKey和allValues是並行,但是當我在allValues(userName)數組上使用謂詞時,我有一個過濾的名稱數組,但沒有更多相關的ID。現在我解決了我的問題,但自定義班也是一個好主意。我可能會牢記以備後用;) – 2013-04-28 11:09:37

0

我建議用的NSDictionary值創建一個NSArray或NSMutableArray裏 - UITableViews意在由陣列,其中該陣列的索引相匹配的被驅動行號。然後,您可以輕鬆地爲考慮到數據結構的字典數組創建自定義過濾器。您的代碼可能包含此示例代碼部分:

NSString *idKey = @"userId"; 
NSString *nameKey = @"userName"; 
NSArray *arr = @[ 
     @{ 
       idKey : @(24), 
       nameKey : @"Oil Can Henry" 
     }, 
     @{ 
       idKey : @(32), 
       nameKey : @"Doctor Eggman" 
     }, 
     @{ 
       idKey : @(523), 
       nameKey : @"Sparticus" 
     }, 
]; 
NSString *searchTerm = @"Spar"; 
NSArray *newArray = [arr filteredArrayUsingPredicate:[NSPredicate predicateWithBlock:^BOOL(id evaluatedObject, NSDictionary *bindings) { 
    return [evaluatedObject[nameKey] hasPrefix:searchTerm]; 
}]]; 

優點:

  • 一個單一的數據結構來表示所有的數據
  • 固有的,確定性的訂貨
  • 爲NSPredicate過濾的支持