在表格视图中search栏和search显示控制器

我试图实现一个search栏,但我没有任何运气处理这个问题。 我真的很感激任何可以提供的帮助。 我有一个大的项目,我有一个表视图,我想实现一个search栏,并看到实时过滤。 我不使用故事板,但我使用XIB。 我已经添加了以下协议:

<UITableViewDelegate,UITableViewDataSource,UISearchBarDelegate,UISearchDisplayDelegate> 

我已经在@interface中声明了2个数组,第一个是整个元素,第二个是过滤的数组:

  NSArray* OldList; NSArray* filteredList; 

然后我设置了行数和部分数量,然后:

 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { myClassCell *cell = [tableView dequeueReusableCellWithIdentifier:MYCELLCLASS]; if (cell == nil) { cell = [myClassCell newFromNib]; } NSMutableDictionary* elem = nil; if (tableView == self.searchDisplayController.searchResultsTableView) { elem = [filteredList objectAtIndex:indexPath.row]; if ([elem count]+1 > indexPath.row) [cell showValues:elem]; else [cell showValues:nil]; } else { elem = [OldList objectAtIndex:indexPath.row]; if ([elem count]+1 > indexPath.row) [cell showValues:elem]; else [cell showValues:nil]; } return cell; } -(void)filterContentForSearchText:(NSString*)searchText scope:(NSString*)scope { NSPredicate *resultPredicate = [NSPredicate predicateWithFormat:@"name contains[c] %@", searchText]; filteredist = [OldList filteredArrayUsingPredicate:resultPredicate]; } -(BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString { [self filterContentForSearchText:searchString scope:[[self.searchDisplayController.searchBar scopeButtonTitles] objectAtIndex:[self.searchDisplayController.searchBar selectedScopeButtonIndex]]]; return YES; } 

在这一点上,我没有做任何改变的xib,没有链接,没有其他的东西。 如果我编译我得到我的表,但显然如果我尝试search的东西,没有任何工作。 此外,如果我滚动到表的结尾应用程序崩溃。 真正的问题是,我看不到search栏的工作。 有人可以帮我吗?

那么你是在正确的轨道上……这正是你的控制器类到你的控制器xib的连接。

当你想把一个search栏和search显示控制器初始化成一个UITableView时,你实际上是添加了第二个表格视图,当它被激活时,必须由UITableViewController类中的代码以与任何UITableView相同的方式进行pipe理。

我已经使用这些问题/答案来检查我自己的答案 – 我build议你看看:

  • 以编程方式创build一个UISearchDisplayController
  • 灰色的UISearchBar与编程的匹配范围栏

我已经阅读了苹果文档 。 我build议你也这样做,以帮助你理解这一点。

第一步:

运行控制器类时,需要为两个表视图设置数据源和委托方法。

在你做任何这个之前,包括这个属性…

 @property (nonatomic, strong) UISearchDisplayController *searchController; 

以下代码描述了如何初始化和设置UISearchBarUISearchDisplayController的相应属性。 如果你在代码中以编程的方式创build一个UITableViewController ,你还需要为它设置数据源和委托(为了保持代码容易阅读,不显示)。

你有两个select – 你select哪一个取决于你的代码和你想要达到什么 – 或者在你的init / awakeFromNib方法中设置这些选项,或者在你的一个表视图控制器(TVC)生命周期方法中设置它们。

选项一 – 初始化

(注1:Paul Hegarty的非凡的iTunesU讲座教会了我如下所示启动/唤醒一个类 – 这样你就可以使用这两种方法 – 你可以调用init或者awakeFromNib。

 - (void)setup { // Provide initialisation code here!!! UISearchBar *searchBar = [[UISearchBar alloc] initWithFrame:CGRectZero]; [searchBar sizeToFit]; [searchBar setDelegate:self]; [self setSearchController:[[UISearchDisplayController alloc] initWithSearchBar:searchBar contentsController:self]]; [self.searchController setSearchResultsDataSource:self]; [self.searchController setSearchResultsDelegate:self]; [self.searchController setDelegate:self]; } - (void)awakeFromNib { [self setup]; } - (id)initWithStyle:(UITableViewStyle)style { self = [super initWithStyle:style]; if (self) { [self setup]; } return self; } 

要么

选项二 – TVC生命周期

 - (void)viewDidLoad { [super viewDidLoad]; UISearchBar *searchBar = [[UISearchBar alloc] initWithFrame:CGRectZero]; [searchBar sizeToFit]; [searchBar setDelegate:self]; [self setSearchController:[[UISearchDisplayController alloc] initWithSearchBar:searchBar contentsController:self]]; [self.searchController setSearchResultsDataSource:self]; [self.searchController setSearchResultsDelegate:self]; [self.searchController setDelegate:self]; [self.tableView setTableHeaderView:self.searchController.searchBar]; // see Note2 ...< other code as required >... } 

注2:无论你select哪个选项,你都需要在viewDidLoad方法中放置下面的代码行。

  [self.tableView setTableHeaderView:self.searchController.searchBar]; // (or just searchBar) 

第二步:

笔记:

  • 代表完整数据集( OldList )的表格视图可以使用self.tableView来调用(PS约定是以小写字母开始每个variables,所以将您的属性名称从OldListoldList )。

  • 表示过滤数据集(filteredList)的表视图可以使用self.searchController.searchResultsTableView来调用。

当你准备好你的tableView:cellForRowAtIndexPath:数据源方法的时候,我怀疑你有其他的数据源(也许是委托)方法需要被告知哪个表视图是当前表视图,才能够正常工作并提供你有一个完全可操作的search结果表视图和searchfunction。

例如:

 - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { if (tableView == self.searchController.searchResultsTableView) return 1; return [[self.oldList sections] count];; } 

和:

 - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { if (tableView == self.searchController.searchResultsTableView) return [self.filteredList count]; return [self.oldList count]; } 

请注意,可能有其他数据源(也可能是委托)方法需要被告知哪个表视图是当前的表视图…我将留给你来确定哪些方法将被修改,调整表格视图所需的相应代码。

第三步:

您将被要求为您的search结果表视图注册一个笔尖和重用标识符。

我更喜欢创build一个单独的nib文件(称为“TableViewCellSearch.xib”),该文件包含一个表视图单元格,重用标识符为“SearchCell”,然后将代码注册到以下UISearchDisplayController委托方法的nib和重用标识符中。

值得注意的是,这个代码在init / awakeFromNib / viewDidLoad的代码块示例之后同样有效。

 - (void)searchDisplayController:(UISearchDisplayController *)controller willShowSearchResultsTableView:(UITableView *)tableView { static NSString *cellIdentifierSearch = @"SearchCell"; UINib *nib = [UINib nibWithNibName:@"TableViewCellSearch" bundle:nil]; [self.searchController.searchResultsTableView registerNib:nib forCellReuseIdentifier:cellIdentifierSearch]; } 

尝试这些build议。

希望这可以帮助。