5

我在 InterfaceBuilder 的 UITableViewController 中添加了一个 UISearchDisplayController。通过添加一个searchBar: searchBar textDidChange: searchText为表重新生成数据数组并调用reloadData.

但是我希望用户下次在搜索栏中触摸时显示以前的搜索,因为触摸(X)并清除它比再次输入要容易得多。但我不能让它去做。以下是我尝试过的代码:

- (void) searchBar: (UISearchBar *) searchBar textDidChange: (NSString *) searchText {
    if( searchText && [searchText length] > 0 ) {
        self.displayedRows = [[NSMutableArray initWithCapacity: 1];
        for( NSString *l in self.allRows ) {
            NSRange r = [l rangeOfString: searchText];
            if( r.location != NSNotFound )
                [self.displayedRows addObject: l];
        }
        [self.searchDisplayController.searchResultsTableView reloadData];
    }
}

- (void) searchDisplayControllerWillBeginSearch: (UISearchDisplayController *) controller {
    if( self.lastSearch && [self.lastSearch length] > 0 ) {
        controller.searchBar.text = self.lastSearch;
        [controller.searchResultsTableView reloadData];
    }
}

- (void) searchDisplayControllerWillEndSearch: (UISearchDisplayController *) controller {
    self.lastSearch = controller.searchBar.text;
    self.displayedRows = self.allRows;
    [self.tableView reloadData];
}

下次我触摸搜索时,最后一个搜索文本适当地出现在搜索栏中,我很惊讶“光标”甚至位于末尾,但没有显示搜索结果,只是原始内容的变暗视图,如搜索字段为空。只要我输入一个字符,搜索结果就会更新。

我尝试将等价物[self.searchDisplayController.searchResultsTableView reloadData]放入每个:

searchDisplayControllerDidBeginSearch: (UISearchDisplayController *) controller
searchDisplayController: (UISearchDisplayController *) controller didLoadSearchResultsTableView: (UITableView *) tableView
searchDisplayController: (UISearchDisplayController *) controller willShowSearchResultsTableView: (UITableView *) tableView
searchDisplayController: (UISearchDisplayController *) controller didShowSearchResultsTableView: (UITableView *) tableView

但它没有任何区别......只是空白,直到我输入一些东西。

有谁知道如何获得预加载的搜索结果?

4

1 回答 1

7

你需要这样的东西:

- (void) searchDisplayControllerDidBeginSearch:(UISearchDisplayController *)controller {
    if(lastSearch.length > 0) {
        NSLog(@"In searchDisplayControllerDidBeginSearch");
        [self.searchDisplayController.searchBar setText:lastSearch];
    }
}

如果您需要进行进一步的更改,我建议打开UIKit标题UISearchBar.hUISearchDisplayController.h查看可以重载的内容和位置。还有,NSLog是你的朋友吗=)

只是为了解释发生了什么以及这与 有何不同...searchBar.text = lastSearchsetText强制textDidChange注册,这反过来又重新进行搜索,然后调用shouldReloadTableForSearchString. 仅更改文本而不使用setText(出于某种原因)不会触发textDidChange.

于 2011-02-03T02:00:03.250 回答