使用 UISearchBar 使用 prepareForSegue 传递 indexPath.row 时遇到问题

Posted

技术标签:

【中文标题】使用 UISearchBar 使用 prepareForSegue 传递 indexPath.row 时遇到问题【英文标题】:Trouble passing indexPath.row with prepareForSegue with UISearchBar 【发布时间】:2012-05-31 11:19:33 【问题描述】:

让整个 Core Data、Storyboard、UISearchBar 三重奏按应有的方式协同工作,我感到非常难过。终于用 Core Data 成功建表,用 Search Text 缩小项目,修改 prepareForSegue,还有一个小问题...

当我单击表中的任何项目以转到详细视图时,未过滤表中的一切都很好。 PrepareForSegue 被调用,细节完美呈现。

当我搜索时,我的表被过滤(我现在要过滤数组选项而不是第二个 NSFetchedResultsController,但不是因为缺乏尝试!)。

当我单击过滤列表中的一个项目时,会调用 prepareForSegue 并推送详细信息视图,但是,它总是从列表中的第一项中提取详细信息!

例如,如果我搜索“c”并且列表缩小到“Charlie”和“Cookie”,当我选择“Charlie”时,我会看到“Charlie”的详细视图。当我选择“Cookie”时,不幸的是,我还看到了“查理”的详细视图

我假设 prepareForSegue 代码是问题所在(可能是错误的?)。代码如下:

    SampleTVC *sampleDetailTVC = segue.destinationViewController;
    sampleDetailTVC.delegate = self;

    // Store selected Role in selectedRole property
    NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow];
  //  self.selectedRole = [self.fetchedResultsController objectAtIndexPath:indexPath];
    if (savedSearchTerm)
        self.selectedRole = [self.searchResults objectAtIndex:indexPath.row];
     else 
        self.selectedRole = [self.fetchedResultsController objectAtIndexPath:indexPath];
    
    NSLog(@"Passing selected role (%@) to SampleTVC", self.selectedRole.name);
    sampleDetailTVC.role = self.selectedRole;

任何帮助将不胜感激!

【问题讨论】:

当您选择“Cookie”时,您能否在获取角色时记录self.searchResultsindexPath.row 的值? 当我添加: if (savedSearchTerm) self.selectedRole = [self.searchResults objectAtIndex:indexPath.row]; NSLog(@"什么是搜索结果:%@什么是索引路径:%@", self.searchResults, indexPath.row); -------------------- 我得到以下信息:什么是 searchresults:charlie, cookie [编辑缩短]什么是 indexpath:(null) ----- I我认为 index.path (null) 可能是问题所在? 在非搜索表上,如果我记录 indexPath 我得到:什么是 indexpath: 2 个索引 [0, 3] 可能......空索引路径可能会将零作为其行。 (我假设您实际上是在记录 indexPath 而不是 indexPath.row。) 您的过滤列表正在显示在与您的完整列表相同的表格视图中,对吗?此外,还可以尝试其他方法,如果您的 segue 连接到表格视图单元格作为其源,您应该能够使用 indexPathForCell: 并将 sender 作为单元格传递。 【参考方案1】:

感谢 Phillip Mills 的回答:

只需添加:

    indexPath = [self.searchDisplayController.searchResultsTableView indexPathForSelectedRow];

完整样本:

    SampleTVC *sampleDetailTVC = segue.destinationViewController;
    sampleDetailTVC.delegate = self;
     // Store selected Role in selectedRole property
    NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow];
    //  self.selectedRole = [self.fetchedResultsController objectAtIndexPath:indexPath];
    if (savedSearchTerm)
         indexPath = [self.searchDisplayController.searchResultsTableView indexPathForSelectedRow];
    self.selectedRole = [self.searchResults objectAtIndex:indexPath.row];
     else 
        self.selectedRole = [self.fetchedResultsController objectAtIndexPath:indexPath];
     
    NSLog(@"Passing selected role (%@) to SampleTVC", self.selectedRole.name);
    sampleDetailTVC.role = self.selectedRole;

【讨论】:

谢谢!,再过 17 个小时我就不会了... :)

以上是关于使用 UISearchBar 使用 prepareForSegue 传递 indexPath.row 时遇到问题的主要内容,如果未能解决你的问题,请参考以下文章

iOS学习—— UISearchBar的使用

ios UISearchBar搜索框的基本使用

我在哪里可以获得 UISearchBar 中使用的放大镜图标?

如何使用 UISearchBar 作为输入附件视图?

UITableView 不使用 UISearchBar 滚动

UISearchBar的使用