如何从一个UITableView的两个数据源中提取

时间:2014-11-25 23:03:29

标签: ios objective-c uitableview

我想知道如何实现一个功能与Instagram应用程序非常相似的搜索栏。我的搜索栏位于UITableView(好友列表)上方。目前,它会过滤好友列表以匹配搜索字词。我的目标是让搜索栏从我的服务器中提取数据(Parse)并在本地搜索的数据下面显示。

IE: 搜索“史蒂夫”将返回用户朋友列表中所有本地史蒂夫的UITableView以及服务器上的其他史蒂夫,但用户不是朋友。然后,用户可以点击该人并向他们发送朋友请求。

我将如何实现此功能?

1 个答案:

答案 0 :(得分:1)

您需要创建符合UITableViewControllerUISearchBarDelegateUITableViewDataSource的视图控制器(最好是UITableViewDelegate)。

正确设置这些协议方法后,您可以在两个dataSource之间切换, 例如NSArrayusersNSMutableArraysearchResults

然后,在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