【问题标题】:Searchbar for UITableView as subview of UIViewControllerUITableView 的搜索栏作为 UIViewController 的子视图
【发布时间】:2014-02-13 20:06:02
【问题描述】:

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

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

我没有任何代码可以显示,因为我没有任何可以工作的东西。谁能指出我正确的方向来实现这一目标?有教程之类的吗?

我用来设置几个单独页面的主要教程是:http://www.raywenderlich.com/16873/how-to-add-search-into-a-table-view

编辑: 我添加了一张图片来展示我需要什么。

所以我有 3 个 UITableView,所有可从主 UIViewController 访问的视图按钮。然后每个 UITableView 都有一个与其自身关联的数组,TableView 数组 2、3 和 4。

搜索栏 2 搜索 TableView 数组 2 搜索栏 3 搜索 TableView 数组 3 Search Bar 4 搜索 TableView Array 4

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

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

【问题讨论】:

  • 在 1 个数组或两个或三个数组中搜索的主要区别是什么?
  • 抱歉我没明白你的意思?
  • 如果您对每个单独的数据数组进行有效搜索,但在搜索所有三个数据时遇到块,我试图了解您的问题。由于没有代码,目前很难提出任何建议。
  • 你需要更清楚地解释你的问题,如果可以的话,甚至添加图片和/或绘图。
  • 编辑了一张图片和更长的描述!

标签: ios uitableview uisearchbar


【解决方案1】:

据我了解,您需要一个通用的实现来搜索和显示来自 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];

附:如果您在数组中存储简单的 NSString,则不需要任何协议

【讨论】:

  • 感谢您的回复。您能否在代码方面向我提供更多信息?我对此比较陌生,只是不确定 3 个数组部分。我在哪里包含该代码?在基本控制器中还是在带有数组的单个 TableView 中?
  • 基本上,以上所有代码都必须在基本控制器中。然后,您可以创建该类的 3 个实例,并设置 3 个不同的对象数组。或者创建这个基类的 3 个子类,但是如果你只想用不同的单元格设置你的 tableView 或者这个 viewController 很少有不同的行为,你应该这样做
  • 好吧,这更有意义。你能用@protocol 稍微解释一下吗?
  • 我已经扩展了我的答案,检查一下
  • 我似乎无法让它工作。我想我一定是在代码中遗漏了什么,这是完整的布局吗?
猜你喜欢
  • 1970-01-01
  • 2017-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-01
  • 2011-06-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多