使用 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.searchResults
和indexPath.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: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 时遇到问题的主要内容,如果未能解决你的问题,请参考以下文章
我在哪里可以获得 UISearchBar 中使用的放大镜图标?