【问题标题】:ios 5 UISearchDisplayController crashios 5 UISearchDisplayController 崩溃
【发布时间】:2011-12-25 09:13:35
【问题描述】:

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

【问题讨论】:

  • +1 为你节省了我输入问题的时间。我遇到了完全相同的问题。

标签: ios5 uitableview xcode4.2 uisearchdisplaycontroller


【解决方案1】:

使用[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;
}

【讨论】:

  • 新问题是搜索结果被加载到不需要的弹出窗口中。我可以以某种方式使用我自己的 (self.tableView) 来显示搜索结果吗?
  • 这是一种非常糟糕的方法,因为您依赖于另一个 tableView 实例。 Cedrick 和 thejaz 的回复更简洁,绝对是要走的路。
  • 当搜索表格视图与原始表格视图共享重复使用的单元格时,我遇到了问题。 UIKit (iOS 7.1) 可能会记录警告消息“没有重复使用表格单元格的索引路径”。稍后,访问无效的 indexPaths 可能会崩溃。让搜索表格视图按照其他人的建议使用自己的单元格缓存将解决此问题,但可能需要手动设置与原始表格视图中的单元格相关联的 segue 和其他内容。
  • 非常感谢,为我节省一天的时间!
【解决方案2】:

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

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

【讨论】:

  • +1。我正在处理一个非常相似的问题,发现一旦我删除了对 registerNib 的所有调用并用不同的加载单元格的方法替换它们,一切正常。
  • 你知道如何用stoaryboards处理他的ios5吗?我创建了自己的单元格来扩展 UITableView 并在情节提要中选择了自定义样式。一切正常,但过滤 tablview 时 cellforrowatindexpath 中的单元格始终为零,所以我收到错误:除了上面的错误,我还看到 *** Terminating app due to unaught exception 'NSInternalInconsistencyException',原因:'UITableView dataSource must return a来自 tableView:cellForRowAtIndexPath 的单元格。如何以编程方式创建我在情节提要中创建的自定义单元格?
  • 谢谢谢谢谢谢!!!这让我发疯,因为我必须为 searchResultsTableView 单元格注册一个 nib,并且将代码放入 viewDidLoad 显然是错误的。如果我能再次支持你的答案,我会这样做!
  • 谢谢。我只是在寻找一种方法来实现这个解决方案,但不知道 searchdisplaycontroller 在创建时调用了哪个方法。
  • 一个星期以来一直在挠头试图调试这个问题。天哪,谢谢。
【解决方案3】:

(推荐使用self.tableview的答案依赖于另一个table view。这是最干净的解决方案,即使搜索控制器自己使用也可以使用。)

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

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

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

【讨论】:

  • 这是迄今为止避免首次加载后崩溃的最佳解决方案!我的意思是,如果您只是过滤掉 已经 获取的数据,那么另一种方式将按预期工作。但如果能够进行远程搜索,那么searchcontroller 表视图显然不应该依赖于原始表视图。
  • 非常有帮助。另请参阅:registerClass: forCellReuseIdentifier: 如果您的单元格是在代码中而不是在 Interface Builder 中定义的。
【解决方案4】:

你可以在

- (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:

【讨论】:

    猜你喜欢
    • 2014-02-09
    • 2012-01-17
    • 2012-08-08
    • 2011-12-10
    • 1970-01-01
    • 2012-02-09
    • 2012-02-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多