2009-08-19 68 views
0

鍵(注:這是一個previous question的擴展。)過濾由值的字典,在亞字典與一個UISearchBar

我有實現的相當複雜的tableview一個搜索欄一定的難度。 tableView有多個部分,兩行文本和一個圖像。所有數據都從plist中加載,然後通過「Name」鍵的值的首字母放入部分。的NSLog返回我的主詞典「sectionedDictionaryByFirstLetter」以下內容:

sectionedDictionaryByFirstLetter:{ 
B = (
    { 
    Name = "B...A Name Starting with B"; 
    Image = "ImageName1.png"; 
    Text = "Some Text"; 
    } 
    ); 
C = (
    { 
    Name = "C...A Name Starting with C"; 
    Image = "ImageName2.png"; 
    Text = "Some Text"; 
    } 
    ); 
N = (
    { 
    Name = "N1...A Name Starting with N"; 
    Image = "ImageName3.png"; 
    Text = "Some Text"; 
    }, 
    { 
    Name = "N2...A Name Starting with N"; 
    Image = "ImageName4.png"; 
    Text = "Some Text"; 
    }, 
    { 
    Name = "N3...A Name Starting with N"; 
    Image = "ImageName5.png"; 
    Text = "Some Text"; 
    } 
); 
} 

我想,以濾除值的子字典的「姓名」鍵。任何人都可以推薦如何去做這個或一些資源學習如何?我一直在關注「開始iPhone 3開發」中的示例,但無法將其轉化爲我的情況。 因此,如果在搜索欄中用戶鍵入「用N」,想我的新字典顯示爲:

filteredSectionedDictionaryByFirstLetter:{ 
N = (
    { 
    Name = "N1...A Name Starting with N"; 
    Image = "ImageName3.png"; 
    Text = "Some Text"; 
    }, 
    { 
    Name = "N2...A Name Starting with N"; 
    Image = "ImageName4.png"; 
    Text = "Some Text"; 
    }, 
    { 
    Name = "N3...A Name Starting with N"; 
    Image = "ImageName5.png"; 
    Text = "Some Text"; 
    } 
); 
} 

只是爲了澄清,我已經安裝在我的視圖搜索欄,我只是隨便麻煩使其功能。我目前正在用本書中的示例中的 - (void)handleSearchForTerm:(NSString *)searchTerm自定義方法進行測試。

感謝您的幫助!


這裏的數據的一般結構。

sectionedDictionaryByFirstLetter 

Key Value 
B Array of Dictionaries with Names beginning with B 
     .... 
C Array of Dictionaries with Names beginning with C 
     ... 
N Array of Dictionaries with Names beginning with N 
    Item 1 Dictionary 1 
    Item 2 Dictionary 2 
    Item 3 Dictionary 3 

      Dictionary 3 
      { 
      Name = "N3...A Name Starting with N"; 
      Image = "ImageName5.png"; 
      Text = "Some Text"; 
      } 

我希望這有些幫助。我仍然拼命尋找這個問題的答案。

從本質上講,有一個小學字典是誰的鑰匙是它包含的項目的第一個字母。在每個第一個字母中,都有一個字典數組,其字母值以「Name」鍵開頭。

+0

看到我的答案,但你不想爲此使用一個字典列表。你想創建一個NSObject子類,並且語法不會太糟糕。 – 2009-08-23 22:48:37

回答

0

好吧,我終於回答了我自己的問題。這是下面的代碼。我主要是遵循這個例子在「Beginning iPhone 3 Development」中搜索數組。我不得不稍微修改它以使其適用於我的問題。這裏是我的代碼:

- (void)handleSearchForTerm:(NSString *)searchTerm 
{ 
NSMutableArray *sectionsToRemove = [[NSMutableArray alloc] init]; 
[self resetSearch]; 
for (NSString *key in self.keys) 
{ 
    NSMutableArray *array = [self.copyOfSectionedDictionaryByFirstLetter valueForKey:key]; 
    NSMutableArray *toRemove = [[NSMutableArray alloc] init]; 
    for (NSDictionary *name in array) 
    { 
     if ([[name objectForKey:@"Name"] rangeOfString:searchTerm options:NSCaseInsensitiveSearch].location == NSNotFound) 
      [toRemove addObject:name]; 
    } 

if ([array count] == [toRemove count]) 
    [sectionsToRemove addObject:key]; 
[array removeObjectsInArray:toRemove]; 
[toRemove release]; 
} 

[self.keys removeObjectsInArray:sectionsToRemove]; 
[sectionsToRemove release]; 
[self.tableView reloadData]; 
} 

如果你想看到完整的示例代碼,看看這是怎麼工作的,你可以從「從iPhone 3發展」網站here下載。這是「部分」的例子。

0

更新

它看起來像你有數組中的字母鍵入數組。

,我可能會使用一個NSPredicate和任何鍵我感興趣的篩選。

NSString *searchString = @"Nancy"; 

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(Name == %@)", Nancy]; 

NSArray *filteredArray = [[sectionedDictionaryByFirstLetter objectForKey:@"N"] filteredArrayUsingPredicate:predicate]; 

有謂詞建設的指南。

還有其他方法,但這是首先想到的。


原來的答案

您可以使用KVC方法:

valueForKeyPath: 

爲了得到你想要的。你應該在KVC蘋果文檔閱讀起來:

http://developer.apple.com/documentation/Cocoa/Conceptual/KeyValueCoding/

有很多種方法「玩」詞典/陣列做你想做什麼。不同的技術會有不同的優勢/優勢。

+0

謝謝!我會看一看。 – Jonah 2009-08-19 20:22:59

+0

你有更具體的想法嗎?我正在挖掘所有這些材料。謝謝! – Jonah 2009-08-20 06:27:44

+0

非常感謝您的幫助!這似乎是在正確的軌道上。但是,我想在每個首字母中搜索,而不是像您的示例中的「N」。我還希望只有包含項目的字母才能保留在字典中。我編輯了這個問題來增加一點清晰度。 – Jonah 2009-08-21 20:17:48

0

我的另一個想法是創建一個「名稱」鍵的所有值的數組。像這樣:

arrayOfNames:(
"B...A Name Starting with B", 
"C...A Name Starting with C", 
"N1...A Name Starting with N", 
"N2...A Name Starting with N", 
"N3...A Name Starting with N" 
) 

然後,在這個數組上運行過濾器。 最後,使用filteredArrayOfNames將項目添加到具有匹配名稱的新字典中。 這似乎是在概念上正確的軌道?有更好的路線嗎?

1

你的數據結構搞砸了你。

只需製作一個要顯示的所有字典的單個數組,然後將其保存排序。把它分成分包商只是混淆了這個問題。

所以,你有一個這樣的數組:

[[NSArray alloc] initWithObjects: 
    [[NSDictionary alloc] initWithObjectsAndKeys: 
    @"a1", @"name", foo, @"bar", nil)],nil], 
    [[NSDictionary alloc] initWithObjectsAndKeys: 
    @"b21", @"name", foo, @"bar", nil)],nil]; 

那麼它的簡單。只需通過搜索欄中的輸入過濾排序後的數組。你甚至可以讓你的項目在CoreData數據庫,最終宣佈做了這樣的功能,讓他們:

if (!self.wordList) { 
    self.wordList = [self getWiordList] 
} else { 
    return self.wordList; 
} 

另外,我建議你創建一個NSObject的子類,並使用這些數組來代替的字典,這樣你就可以實現點訪問並且語法很好。在Obj C中使用字典和列表並不像在Python中那樣好。

子類NSObject很簡單。

+0

感謝您的回答。我使用字典分解成分區的原因是顯示一個分段的表格視圖。現在,表格顯示了所有的單元格,並在正確的部分中顯示了每個字母的標題以及部分索引。我不確定我將如何使用數據構建您的建議來重新創建此設計。 但是,我可以重新組織它如何推薦過濾,然後將其更改回當前格式以顯示數據。 此外,我可能忽略提及數據存儲在plist中。 – Jonah 2009-08-24 01:49:56