ios 5 UISearchDisplayController 崩溃

发布于 2024-12-14 15:02:11 字数 826 浏览 0 评论 0原文

我正在 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 单元格的单元格标识符。 但我不知道怎么办。 预先感谢您的任何帮助。 =)

I am implementing a UITableView with UISearchDisplayController in xcode 4.2.
UITableView & UISearchDisplayController are created in StoryBoard.
I set the Cell Identifier (SampleCell) for UITableView and access it like

cell = [tableView dequeueReusableCellWithIdentifier:@"SampleCell"];

UItableView is working fine.
But once i try to search, the app crash with below error.

*** 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:'

I guess I need to set the cell identifier for self.searchDisplayController.searchResultsTableView cell.
But I don't know how.
Thanks in advance for any help. =)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

烟柳画桥 2024-12-21 15:02:11

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

Use [self.tableView dequeue...], not [tableView dequeue...].

The cell you're trying to dequeue is linked to your primary view controller's tableView in the storyboard, NOT the searchDisplayController's newly created tableView (which has no cell identifiers linked to it). If you just message "tableView" then your dequeue message goes to the searchDisplayController's tableView since that's what was passed into the cellForRowAtIndexPath:... method.

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

    // do your thing

    return cell;
}
三生一梦 2024-12-21 15:02:11

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

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

Hard bug to track indeed, it seems that every time you do a search a new tableview is created. Meaning that your cell registering has to be taken out of ViewDidLoad since this will only work for the first search. Instead use the following delegate method to do cell registering and customization:

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

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

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

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

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

(The answer that recommends using self.tableview is dependent on another table view. This is the cleanest solution and can be used even if the search controller is used by itself.)

You need to register the cells on the UISearchDisplayController's UITableView. The best way to do that is to register the cells when that table view is loaded.

UISearchDisplayDelegate has a method that notifies you when the table view is loaded - just like viewDidLoad but for the search table view.

- (void)searchDisplayController:(UISearchDisplayController *)controller didLoadSearchResultsTableView:(UITableView *)tableView
{
    [tableView registerNib:[UINib nibWithNibName:@"MyCellNib" bundle:[NSBundle mainBundle]] forCellReuseIdentifier:@"MyCellIdentifier"];
}
追风人 2024-12-21 15:02:11

您可以在

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

中执行

[searchResultsTableView registerNib:[UINib nibWithNibName:@"someNib​​Name" bundle:nil] forCellReuseIdentifier: @"yourReuseId"];

然后你就可以在

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

正常的

[tableView dequeueReusableCellWithIdentifier:

You can in

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

do

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

Then you're able to use in

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

the normal

[tableView dequeueReusableCellWithIdentifier:

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文