我想知道如何实现一个功能与Instagram应用程序非常相似的搜索栏。我的搜索栏位于UITableView(好友列表)上方。目前,它会过滤好友列表以匹配搜索字词。我的目标是让搜索栏从我的服务器中提取数据(Parse)并在本地搜索的数据下面显示。
IE: 搜索“史蒂夫”将返回用户朋友列表中所有本地史蒂夫的UITableView以及服务器上的其他史蒂夫,但用户不是朋友。然后,用户可以点击该人并向他们发送朋友请求。
我将如何实现此功能?
答案 0 :(得分:1)
您需要创建符合UITableViewController
,UISearchBarDelegate
和UITableViewDataSource
的视图控制器(最好是UITableViewDelegate
)。
正确设置这些协议方法后,您可以在两个dataSource之间切换,
例如NSArray
为users
,NSMutableArray
为searchResults
。
然后,在UISearchBarDelegate
方法中,您可以使用搜索文本谓词的结果更新searchResults
可变数组并刷新tableView
数据。
如果取消或清除搜索,searchResults
应返回nil
。
在UITableViewDataSource
方法中,检查searchResults
是否存在,如果存在,请从该数组加载单元格:
@interface YourViewController () <UISearchBarDelegate, UITableViewDataSource, UITableViewDelegate>
/* ... */
@property (nonatomic, strong) NSMutableArray *searchResults;
@property (nonatomic, strong) NSArray *users;
@end
@implementation YourViewControler
/* ... */
- (void)setSearchResults:(NSMutableArray *)searchResults
{
_searchResults = searchResults;
[self.mainView.collectionView reloadData];
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
if (self.searchResults) {
return self.searchResults.count;
} else {
return users.count;
}
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
YourTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
if (self.searchResults) {
/* ... */
} else {
/* ... */
}
return cell;
}
- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText
{
if (searchText.length > 2) {
NSPredicate *searchPredicate = [NSPredicate predicateWithFormat:@"(user.name CONTAINS[cd] %@) OR (user.username CONTAINS[cd] %@)", searchText, searchText];
self.searchResults = [[self.users filteredArrayUsingPredicate:searchPredicate] mutableCopy];
NSLog(@"Search Result: %@", [self.searchResults valueForKey:@"username"]);
} else if (searchText.length == 0) {
self.searchResults = nil;
}
}
- (void)searchBarCancelButtonClicked:(UISearchBar *)searchBar
{
self.searchResults = nil;
searchBar.text = @"";
[searchBar resignFirstResponder];
}
- (void)searchBarSearchButtonClicked:(UISearchBar *)searchBar
{
[searchBar resignFirstResponder];
}
@end