在表格视图中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;
以下代码描述了如何初始化和设置UISearchBar
和UISearchDisplayController
的相应属性。 如果你在代码中以编程的方式创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,所以将您的属性名称从OldList
为oldList
)。 -
表示过滤数据集(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议。
希望这可以帮助。