UISearchDisplayController - 显示来自服务器的搜索结果

时间:2014-05-14 22:17:20

标签: ios objective-c arrays uisearchbar uisearchdisplaycontroller

我遇到了尝试在我的UISearchDisplayController和表格视图控制器中显示搜索结果的问题。

我有REST API服务器端点用于获取搜索结果,我在用户单击“搜索”按钮时发送请求并尝试将项目数组填充到搜索显示控制器中。不幸的是控制器表现得非常奇怪..

以下是我的表视图控制器的代码,在 viewDidLoad 方法中我初始化搜索:

LSDropdownViewController *menuCtrl = (LSDropdownViewController *)[self parentViewController];

[self setSearchBar:menuCtrl.topSearchBar];
[self.searchBar setDelegate:self];
[self.searchBar setBackgroundColor:[UIColor clearColor]];
[self.searchBar setBackgroundImage:[UIImage imageWithGradientColors]];

// set search cancel button color
[[UIBarButtonItem appearanceWhenContainedIn:[UISearchBar class], nil] setTintColor:[UIColor whiteColor]];

self.searchController = [[UISearchDisplayController alloc] initWithSearchBar:menuCtrl.topSearchBar contentsController:self];

[self.searchController setDelegate:self];
[self.searchController setSearchResultsDataSource:self.tableView.dataSource];
[self.searchController setSearchResultsDelegate:self.tableView.delegate];

我点击请求如下:

- (void)searchBarSearchButtonClicked:(UISearchBar *)searchBar {
MyHTTPClient *api = [MyHTTPClient create];
[api searchPopularCollectionsByText:searchBar.text success:^(AFHTTPRequestOperation *operation, id collections) {
        [self.searchResults removeAllObjects];
        NSArray *data = [collections objectForKey:@"data"];
        if ([data count] > 0) {
            NSMutableArray *result = [[NSMutableArray alloc] init];
            for (NSDictionary *collectionData in data) {
                LSCollection *collection = [[LSCollection alloc] initWithDictionary:collectionData];
                [result addObject:collection];
            }

            [self.searchResults addObjectsFromArray:result];
            [self.searchController.searchResultsTableView reloadData];

            [result removeAllObjects];
            result = nil;
        }
} failure:nil];
}

如果响应包含项目数组,我在searchResults数组中填充它,在其他方法中我检查正确的数据数组(例如在cellForRowAtIndexPath中):

UITableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:@"collectionCell" forIndexPath:indexPath];

LSCollection *collection;
if (tableView == self.searchController.searchResultsTableView) {
    collection = [self.searchResults objectAtIndex:indexPath.row];
} else {
    collection = [self.collections objectAtIndex:indexPath.row];
}

...

但是看看截屏视频,有时searchResults没有填充..

视频 http://screencast.com/t/enImJQuA

更多具有搜索结果位置的表格视图不固定,您也可以向下滚动到原始列表。

这可能有什么错误?使用REST服务器处理点击搜索的正确方法是什么?

谢谢!

1 个答案:

答案 0 :(得分:0)

tableview委托方法在同一个viewcontroller中委托“searchBarSearchButtonClicked”方法吗?试试

[self.searchController setSearchResultsDataSource:self];
[self.searchController setSearchResultsDelegate:self];

如果没有工作,请告诉我有关tableview委托方法的更多信息。他们在跑吗?