ios 5 UISearchDisplayController崩溃

时间:2011-11-09 14:45:01

标签: ios5 uitableview xcode4.2 uisearchdisplaycontroller

我在xcode 4.2中使用UISearchDisplayController实现了一个UITableView。 UITableView& UISearchDisplayController是在StoryBoard中创建的。 我为UITableView设置了Cell Identifier(SampleCell),并像

一样访问它
cell = [tableView dequeueReusableCellWithIdentifier:@"SampleCell"];

UItableView工作正常。 但是一旦我尝试搜索,应用程序崩溃就会出现以下错误。

*** Assertion failure in -[UISearchResultsTableView _createPreparedCellForGlobalRow:withIndexPath:], /SourceCache/UIKit_Sim/UIKit-1912.3/UITableView.m:6072
2011-11-09 22:22:16.058 SampleApp[14362:fb03] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'UITableView dataSource must return a cell from tableView:cellForRowAtIndexPath:'

我想我需要为self.searchDisplayController.searchResultsTableView单元格设置单元格标识符。 但我不知道怎么做。 在此先感谢您的帮助。 =)

4 个答案:

答案 0 :(得分:83)

使用[self.tableView dequeue...],而不是[tableView dequeue...]

您尝试出列的单元格与故事板中的主视图控制器tableView相关联,而不是searchDisplayController新创建的tableView(没有链接的单元格标识符)它)。如果您只是发送消息“tableView”,那么您的出列消息将转到searchDisplayController's tableView,因为这是传递给cellForRowAtIndexPath: ...方法的内容。

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:@"CellId"];

    // do your thing

    return cell;
}

答案 1 :(得分:16)

确实要跟踪的难题,似乎每次进行搜索时都会创建一个新的tableview。这意味着您的单元格注册必须从ViewDidLoad中取出,因为这只适用于第一次搜索。而是使用以下委托方法进行单元格注册和自定义:

    - (void)searchDisplayControllerWillBeginSearch:(UISearchDisplayController *)controller
{
    [self.searchDisplayController.searchResultsTableView 
     registerNib:[UINib nibWithNibName:@"YOURCELLNIB" bundle:nil] forCellReuseIdentifier:@"YOURCELLID"];
    self.searchDisplayController.searchResultsTableView.separatorColor = [UIColor clearColor];
}

答案 2 :(得分:10)

(建议使用self.tableview的答案取决于另一个表视图。这是最干净的解决方案,即使单独使用搜索控制器也可以使用。)

您需要在UISearchDisplayController的UITableView上注册单元格。最好的方法是在加载表视图时注册单元格。

UISearchDisplayDelegate有一个方法,可以在加载表视图时通知您 - 就像viewDidLoad一样,但是对于搜索表视图。

- (void)searchDisplayController:(UISearchDisplayController *)controller didLoadSearchResultsTableView:(UITableView *)tableView
{
    [tableView registerNib:[UINib nibWithNibName:@"MyCellNib" bundle:[NSBundle mainBundle]] forCellReuseIdentifier:@"MyCellIdentifier"];
}

答案 3 :(得分:0)

你可以在

- (void)searchDisplayController:(UISearchDisplayController *)searchDisplayController didLoadSearchResultsTableView:(UITableView *)searchResultsTableView

[searchResultsTableView registerNib:[UINib nibWithNibName:@"someNibName" bundle:nil] forCellReuseIdentifier:@"yourReuseId"];

然后你可以使用

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

正常

[tableView dequeueReusableCellWithIdentifier: