Ios5 ios 5 UISearchDisplayController崩溃

Ios5 ios 5 UISearchDisplayController崩溃,ios5,uitableview,xcode4.2,uisearchdisplaycontroller,Ios5,Uitableview,Xcode4.2,Uisearchdisplaycontroller,我正在xcode 4.2中使用UISearchDisplayController实现UITableView。 UITableView和UISearchDisplayController是在情节提要中创建的。 我为UITableView设置了单元标识符(SampleCell),并按如下方式访问它 cell = [tableView dequeueReusableCellWithIdentifier:@"SampleCell"]; UItableView工作正常。 但一旦我尝试搜索,应用程序就会崩

我正在xcode 4.2中使用UISearchDisplayController实现UITableView。 UITableView和UISearchDisplayController是在情节提要中创建的。 我为UITableView设置了单元标识符(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单元格设置单元格标识符。 但我不知道怎么做。
提前感谢您的帮助。=)

难以追踪的bug实际上,每次搜索时都会创建一个新的tableview。这意味着您的手机注册必须从ViewDidLoad中删除,因为这只适用于第一次搜索。而是使用以下委托方法进行单元格注册和自定义:

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

使用
[self.tableView出列…]
,而不是
[tableView出列…]

您尝试退出队列的单元格链接到情节提要中主视图控制器的
tableView
,而不是
searchDisplayController
新创建的
tableView
(没有单元格标识符链接到它)。如果您只是发送消息“
tableView
”,那么您的出列消息将转到
searchDisplayController的
tableView,因为这是传递到
cellForRowAtIndexPath:
。。。方法

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

    // do your thing

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

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

UISearchDisplayDelegate有一个方法,在加载表视图时通知您-与viewDidLoad类似,但用于搜索表视图

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

-(无效)searchDisplayController:(UISearchDisplayController*)searchDisplayController didLoadSearchResultsTableView:(UITableView*)searchResultsTableView

[searchResultsTableView注册表项nb:[UINib nibWithNibName:@“someNibName”bundle:nil]forCellReuseIdentifier:@“yourReuseId”]

然后你就可以在

-(UITableViewCell*)tableView:(UITableView*)tableView cellForRowAtIndexPath:(nsindepath*)indepath{

正常的


[tableView dequeueReusableCellWithIdentifier:

+1.我当时正在处理一个非常类似的问题,发现一旦我删除了对registerNib的所有调用,并用另一种加载单元格的方法替换它们,一切都很好。你知道如何使用stoaryboards处理ios5吗?我创建了自己的单元格,扩展了UITableView和se选择了故事板中的自定义样式。一切正常,但在筛选TableView时,cellforrowatindexpath中的单元格始终为零,因此我得到了错误:除了上面的错误外,我看到***由于未捕获的异常“nsInternalInconsistencException”终止应用程序,原因是:“UITableView数据源必须从tableVi返回一个单元格。”ew:cellForRowAtIndexPath。我如何以编程方式创建我在故事板中创建的自定义单元格?谢谢,谢谢,谢谢!!!这让我发疯了,因为我必须为searchResultsTableView单元格注册nib,而将代码放在viewDidLoad中显然是错误的。如果我能再次投票给你的答案,我会这样做的t!谢谢。我只是在寻找一种实现此解决方案的方法,但不知道创建此解决方案时searchdisplaycontroller调用哪种方法。一周来,我一直在努力调试此问题。天哪,谢谢你。+1为你节省了我键入问题的时间。我遇到了确切的sam问题。新问题是搜索结果加载到不需要的popover。我可以使用我自己的(
self.tableView
)显示搜索结果?这是一种非常糟糕的方法,因为您依赖于另一个tableView实例。Cedrick和thejaz的回复更清晰,而且肯定是一种方式。当搜索表视图与原始表视图共享重用的单元格时,我遇到了问题。UIKit(iOS 7.1)可能会记录警告消息“没有重复使用的表单元格的索引路径"。稍后,访问无效的索引路径时可能会崩溃。让搜索表视图按照其他人的建议使用自己的单元格缓存将解决此问题,但是可能需要手动设置分段以及与原始表视图中的单元格相关联的其他内容。非常感谢,省去了我的时间!这是迄今为止避免崩溃的最佳解决方案h在第一次加载之后!我的意思是,如果您只想过滤掉已经获取的数据,那么另一种方法会像预期的那样工作。但是如果您能够进行远程搜索,searchcontroller表视图显然不应该依赖于原始表视图。非常有帮助。另请参见:
registerClass:forCellReuseIdentifier:
如果您的单元格是在代码中定义的,而不是在界面生成器中定义的。