我在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单元格设置单元格标识符。 但我不知道怎么做。 在此先感谢您的帮助。 =)
答案 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: