2014-02-13 49 views
0

在我的應用程序中,我有幾個控制器與數組和搜索功能。這些數組顯示在表格中,搜索工作正常。UITableView的搜索欄作爲UIViewController的子視圖

但是,我試圖在我的應用程序的主頁上創建一個通用搜索。這將搜索所有數組(我不介意將它們組合爲主頁面視圖控制器中的單個數組)。我已經嘗試了很多方法來完成這個任務,但是仍然會繼續發揮。我得到的最遠是搜索欄顯示,但每次嘗試搜索時都會崩潰。

我沒有任何代碼顯示,因爲我沒有任何工作。任何人都可以指出我正確的方向來完成這個任務嗎?任何教程等?

我用來設置幾個單獨的頁面主要教程:http://www.raywenderlich.com/16873/how-to-add-search-into-a-table-view

編輯: 我增加了一個形象展示我需要什麼。

所以我有3個UITableViews,從主UIViewController的所有可訪問的視圖按鈕。每個的UITableView然後具有相關聯的數組本身,TableView中陣列2,3和4

搜索欄2點的搜索通過的TableView陣列2 搜索欄3點的搜索通過的TableView陣列3 搜索欄4個檢索通過的TableView陣列4

現在我有主UIViewController上的搜索欄1。我想要這個搜索欄搜索所有的數組(2,3和4)。我不介意將所有數組數據合併到UIViewController文件中存在的單個數組中,但我無法找到使搜索正常工作的方法。

圖片: http://s14.postimg.org/o5z1e5j75/Untitled_1.png

+0

搜索1個數組或兩個或三個之間的主要區別是什麼? – Andy

+0

對不起,我不明白你的意思? –

+0

我試圖瞭解你的問題,如果你有一個工作搜索每個單獨的數據數組,但在跨所有三個搜索時觸擊塊。由於沒有代碼,因此現在很難提出任何建議。 – Andy

回答

0

我的理解,你需要搜索和顯示來自3個不同陣列的內容的一個通用implementaion。所以,在這種情況下,我通常會創建基本控制器類,它將具有搜索欄和tableView,所有搜索功能以及指向數據源數組的指針。 直接在瀏覽器中輸入,所以可能會出現錯誤。

@interface BaseListController : UIViewController 
{ 
UITableView* _tableView; 
UISearchBar* _searchBar; 
} 
@property NSArray * source; 
@poperty (readonly) NSArray * founded; 
@end; 

比,你需要確保所有3個的數組對象支持你的特殊查詢界面:

@protocol SearchedItem <NSObject> 
@required 
- (NSString *)searchKey; 
@end 

這是你的搜索方法後,將看起來像:

- (void)searchForKey:(NSString *)searchText 
{ 
NSPredicate * predicate = [NSPredicate predicateWithFormat:@"searchKey contains[cd] %@", searchText]; 
_founded = [self.source filteredArrayUsingPredicate:predicate]; 

[_tableView reloadData]; 
} 

編輯:擴展答案如何以及爲什麼需要使用@protocol

首先讀this aticle,它清楚地說明了如何使用@protocol。
我仍然不知道你將保留在這3個數組中。但讓我們說你會保留3個不同類的對象繼承fom NSObject,並且可以稱它們爲Chapter,RecipeIngredient。他們每個人都有自己獨特的名字。爲了獨立處理他們的混音,這些類必須有一些共同點。這個常見的事情將是單一接口 - 它們都必須符合你定義的@協議。這意味着,它不管這個對象的類是什麼,但是你可以確定它會響應被調用的協議的方法。代碼示例:

// .h file 
@interface Chapter : NSObject <SearchedItem> 
@property NSString * chapterName; 
@property NSArray * recipes; 
@end 

@interface Recipe : MSObject <SearchedItem> 
@property NSString * recipeName; 
@property NSArray * ingredients; 
@end 

@interface Ingredient : NSObject <SearchedItem> 
@property NSString * prettyName; 
@property NSNumber * enoughCount; 
@end 

// .m file There you must implement protocol's requied method! 
@implementation Chapter 
- (NSString *)searchKey{ 
return self.chapterName; 
} 
@end 

@implementation Recipe 
- (NSString *)searchKey{ 
return self.recipeName; 
} 
@end 

@implementation Ingredient 
- (NSString *)searchKey{ 
return self.prettyName; 
} 
@end 

所以現在,在你cellForRowAtIndexPath:方法,你可以很容易得到單行標題不知道哪些數據,目前有:

id<SearchedItem> item = self.source; //self.founded 
cell.titleLabel.text = [item searchKey]; 

附:如果您在您的陣列中存儲簡單的NSString,則不需要任何協議

+0

感謝您的回覆。你可以提供更多關於代碼的信息嗎?我對此相對比較陌生,對3個數組部分不太確定。我在哪裏包含該代碼?在基礎控制器中還是在具有數組的單個TableView中? –

+0

基本上,上面的所有代碼都必須位於基本控制器中。然後你可以創建這個類的3個實例,並設置3個不同的對象數組。或者創建這個基類的3個子類,但是你應該這樣做,如果你只是想用不同的單元格來設置你的tableView或者這個viewController幾乎不會有不同的行爲 –

+0

好吧,這樣做更有意義。你能稍微多解釋一下@protocol這一點嗎? –