Searchbar for UITableView作为UIViewController的子视图

时间:2014-02-13 20:06:03

标签: ios uitableview uisearchbar

在我的应用程序中,我有几个带阵列和搜索功能的控制器。这些数组显示在表格中,搜索工作正常。

但是,我正在尝试在我的应用主页上创建通用搜索。这将搜索所有数组(我不介意将它们组合为主页面视图控制器中的单个数组)。我已经尝试了很多方法来实现这一点,但继续打击块。我得到的最远的是搜索栏显示,但每次我尝试搜索时它都会崩溃。

我没有显示任何代码,因为我没有任何可行的代码。任何人都可以指出我正确的方向来实现这一目标吗?任何教程等?

我用来设置几个单独页面的主要教程是: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 Array 4

现在我在主UIViewController上有搜索栏1。我想要这个搜索栏搜索所有数组(2,3和4)。我不介意将所有数组数据合并到UIViewController文件中存在的单个数组中,但我找不到让搜索工作的方法。

图像: http://s14.postimg.org/o5z1e5j75/Untitled_1.png

1 个答案:

答案 0 :(得分:0)

据我了解,您需要一个通用的实现方法来搜索和显示来自3个不同阵列的内容。因此,在这种情况下,我通常会创建基本控制器类,它将具有搜索栏和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个阵列中保留什么。但是,假设您将保留NSObject继承的3个不同类的对象,并让它们称为ChapterRecipeIngredient。他们每个人都有自己独特的名称。为了独立处理他们的混音,这些课程必须有一些共同点。这个常见的东西是单一界面 - 所有这些都必须符合您定义的@protocol。这意味着,无论这个对象的类是什么,但你可以肯定它会响应被调用的协议方法。代码示例:

// .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];

P.S。如果您在数组中存储简单的NSStrings,则不需要任何协议