2011-06-10 103 views
2

我注意到要執行表格搜索,必須將該數據的副本插入到搜索數組中。UISearchBar搜索包含文本,潛在文字和圖像的表格行

E.g.

//Initialize the array. 
listOfItems = [[NSMutableArray alloc] init]; 

NSArray *countriesToLiveInArray = [NSArray arrayWithObjects:@"Iceland", @"Greenland", @"Switzerland", @"Norway", @"New Zealand", @"Greece", @"Rome", @"Ireland", nil]; 
NSDictionary *countriesToLiveInDict = [NSDictionary dictionaryWithObject:countriesToLiveInArray forKey:@"Countries"]; 

NSArray *countriesLivedInArray = [NSArray arrayWithObjects:@"India", @"U.S.A", nil]; 
NSDictionary *countriesLivedInDict = [NSDictionary dictionaryWithObject:countriesLivedInArray forKey:@"Countries"]; 

[listOfItems addObject:countriesToLiveInDict]; 
[listOfItems addObject:countriesLivedInDict]; 

//Initialize the copy array. 
copyListOfItems = [[NSMutableArray alloc] init]; 

那麼搜索到的是存儲在複製數組中的對象。

我的問題是,如何在特定單元格中搜索包含文本,子文本和圖像的單元格行。

回答

3

(1)

實際上並沒有像搜索表格那樣的東西。當用戶在UISearchBar中輸入文字時發生的事完全取決於您 - 您可以使該操作成爲您喜歡的任何內容。你所要做的就是充當結果表的代表和數據源,並根據構成任何表的基礎的標準三大問題形成結果表(「有多少部分有你?本節中的行?此行的單元格是什麼?「)任意您喜歡的方式。結果表通常看起來像是原始表格的簡化版本,但這並不是必需的!它可以是你想要的任何表格。

(2)

請勿混淆Model和View。桌子只是一個視圖。您的數據是模型。它是模型,您的數據是原始表格的基礎,您將要搜索。所以當用戶鍵入你的UISearchBar並且你開始搜索時,你想要形成一個新的Model,它將成爲結果表的基礎。你如何形成它完全取決於你。通常情況下,您需要過濾器原始模型,以便您的結果模型中剩下的唯一內容就是可視爲有效結果的內容。你可以通過走完整個原始模型,將符合搜索準則的所有內容放入新模型中來完成。或者,如果原始模型是數組,則可以使用其中一個filteredArray方法來幫助您。最靈活的方式是形成與塊的謂詞,在我書中的例子:

NSPredicate* p = [NSPredicate predicateWithBlock: 
        ^BOOL(id obj, NSDictionary *d) { 
         NSString* s = obj; 
         NSStringCompareOptions options = NSCaseInsensitiveSearch; 
         return ([s rangeOfString:sbc.searchBar.text 
             options:options].location != NSNotFound); 
        }]; 
self.filteredStates = [states filteredArrayUsingPredicate:p]; 

在這個例子中,s(數組的一個項目)是一個字符串,每次,我查看用戶的搜索詞是否出現在該字符串中。但是,如果您有一本字典或其他結構同時擁有圖像的標題和副標題以及信息,則可以用任何您喜歡的方式查看該字典。根據搜索項是否通過測試,無論您的是否附加到通過測試的概念,只是返回YES或NO的問題。

(3)

剩餘的大問題是當以形成結果模型。我通常首先通過使結果模型與原始模型相同來響應searchDisplayControllerWillBeginSearch,否則當用戶輸入時,結果表將會顯示「無結果」。 (這也許就是爲什麼你認爲首先要做的就是複製原始模型。)然後,我可以根據searchBarSearchButtonClicked(用戶完成輸入並點擊搜索)做出實際的過濾,或者如果模型很小足夠了,我可以在用戶輸入每個字母后重新過濾它,以響應searchBar:textDidChange(用戶在搜索欄中鍵入了一個字母)。

2

涉及到幾個步驟。請注意,下面的代碼只是我現在手動輸入的一個例子,所以它可能不會編譯,只是給你一個想法。

1)確保您有一個包含所有單元格值的數組。

2)創建該數組的副本,並在您的表委託方法中返回單元格時使用該副本作爲數據源。

3)爲自己設定爲代表的的UISearchBar,並且其響應事件:

- (void)searchBarButtonClicked(UISearchBar *)searchBar { 
    [self doSearch:searchBar.text]; 
} 

- (void)searchBar(UISearchBar *)searchBar textDidChange:(NSString *)searchTerm { 
    if (searchTerm.length == 0) { 
     [self resetSearch]; 
     [table reloadData]; 
    } 
    else 
     [self doSearch:searchTerm]; 
} 

- (void)searchBarCancelButtonClicked:(UISearchBar *)searchBar { 
    searchBar.text = @""; 
    [self resetSearch]; 
    [table reloadData]; 
    [searchBar resignFirstResponder]; 
} 

4)創建的其他方法

resetSearch方法,只需要你的全部數據陣列複製到通過你的表代表使用的數據源陣列:搜索時

- (void)resetSearch { 
    self.tableSourceArray = [self.dataSourceArray copy]; // Or write a deep copy if you want to. 
} 

然而,我們需要將datasource濾鏡陣列。你可能能夠創造更高效的東西 - 這只是一個例子。

- (void)doSearch:(NSString *)searchTerm { 

    NSMutableArray *filtered = [[NSMutableArray alloc] init]; 
    for (NSString *item in self.self.dataSourceArray) { 
     if ([item rangeOfString:searchTerm options:NSCaseInsensitiveSearch].location != NSNotFound]) 
      [filtered addObject:[item copy]]; 
    } 

    self.tableSourceArray = filtered; 
} 

這就是它!

Tim

+0

剛注意到這個問題在6月被問到了!我回答它沒有檢查:( – tarmes 2011-11-23 13:04:18

+0

我需要一個答案,所以我復活了。不想重新發布相同的問題,並使重複 – Spire 2011-11-24 10:18:52

相關問題