在 UISearchDisplayController 之后 prepareForSegue
Posted
技术标签:
【中文标题】在 UISearchDisplayController 之后 prepareForSegue【英文标题】:prepareForSegue after UISearchDisplayController 【发布时间】:2012-04-05 17:38:37 【问题描述】:编辑:
我刚刚发现:How to segue from a UISearchBarDisplayController result to a detailViewController
我来看看!
我正在使用情节提要将“搜索栏和搜索显示控制器”与核心数据 fetchedResultsController 相结合。也就是说,我必须区分:
if (self.tableView == self.searchDisplayController.searchResultsTableView)
...
以及我刚刚列出从数据存储中获取的结果的情况。
但是,在以下情况下,我无法获取正确的行(索引路径):
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
if ([segue.identifier isEqualToString:@"StoreDetails"])
UINavigationController *navigationController = segue.destinationViewController;
StoreDetailsTableViewController *controller = (StoreDetailsTableViewController *)navigationController.topViewController;
controller.managedObjectContext = self.managedObjectContext;
Store *storeToDetail = nil;
NSIndexPath *indexPath = [self.tableView indexPathForCell:sender]; // This gives wrong row when having searched using searchDisplayController
NSLog(@"Row: %i", indexPath.row); // row is always 0
if (self.tableView == self.searchDisplayController.searchResultsTableView)
storeToDetail = [self.filteredListContent objectAtIndex:indexPath.row];
else
storeToDetail = [self.fetchedResultsController objectAtIndexPath:indexPath];
controller.storeToDetail = storeToDetail;
之后调用:
- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString
[self filterContentForSearchText:searchString scope:@"All"];
...
与:
- (void)filterContentForSearchText:(NSString*)searchText scope:(NSString*)scope
[self.filteredListContent removeAllObjects];
for (Store *store in [self.fetchedResultsController fetchedObjects])
if ([scope isEqualToString:@"All"] || [store.name isEqualToString:scope])
NSComparisonResult result = [store.name compare:searchText options:(NSCaseInsensitiveSearch|NSDiacriticInsensitiveSearch) range:NSMakeRange(0, [searchText length])];
if (result == NSOrderedSame)
[self.filteredListContent addObject:store];
取自 Apple 的 TableSearch 示例。
原来的问题是双重的:
1) self.tableView 似乎不等于 self.searchDisplayController.searchResultsTableView 是 prepareForSegue
2) 搜索到的 indexPath (row) 始终为 0。
我想我可以使用 didSelectRow... 代替或组合使用,但我相信 prepare... 应该是可能的?!此外,在尝试使用 didSelectRow 时...我确定如何将对象从相关行传递到目标控制器。也就是说,我可以在didSelectRow中得到正确的indexPath...但我只知道如何在preparFor...中获取segue目的地:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
Store *storeToDetail = nil;
if (tableView == self.searchDisplayController.searchResultsTableView)
storeToDetail = [self.filteredListContent objectAtIndex:indexPath.row];
else
storeToDetail = [self.fetchedResultsController objectAtIndexPath:indexPath];
// How to get segue destination controller and set object?!
// Before doing:
[self performSegueWithIdentifier:@"StoreDetails" sender:self];
非常感谢任何帮助。也许是对展示如何组合这些东西的教程的参考。
谢谢!
【问题讨论】:
【参考方案1】:在这种情况下,prepareForSegue:sender:
的 sender
参数设置为启动 segue 的表格视图单元格。
只需向您的单元格添加一个属性,该属性包含属于该单元格的Store
,您无需执行任何索引路径或表格视图比较舞蹈。
你最终应该得到一些简单的东西
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
FooCell *cell = (FooCell *)[self.tableView dequeueReusableCellWithIdentifier:CELL_IDENTIFIER];
Foo *foo = [self fooForIndexPath:indexPath];
cell.foo = foo;
// additional initialization
return cell;
和
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
if ([segue.identifier isEqualToString:@"view detail"])
DetailViewController *destViewController = segue.destinationViewController;
destViewController.foo = [(FooCell *)sender foo];
【讨论】:
哦。我的。天哪。你刚刚改变了我的生活。我刚刚在我的 UITableViewCell 子类中添加了一个 dataID 参数(它已经为我项目中的每个单元格进一步子类化),现在,正如你所说,我不再需要担心那些烦人的索引路径或表格视图比较了!我真的希望我能不止一次投票。再次感谢!【参考方案2】:-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
如果(self.filteredListContent)
//NSLog(@"后过滤数据";
其他
//NSLog(@"post all";
【讨论】:
【参考方案3】:您使用了错误的测试。
if (self.tableView == self.searchDisplayController.searchResultsTableView)
...
这总是会失败,你在问两个不同的 tableViews 是否不同。答案始终是否定的。
但是,您可以测试发件人是否来自 searchResultsTableView。
NSIndexPath *searchIndexPathOfSelectedCell = [self.searchDisplayController.searchResultsTableView indexPathForCell:sender];
if (searchIndexPathOfSelectedCell)
...
【讨论】:
以上是关于在 UISearchDisplayController 之后 prepareForSegue的主要内容,如果未能解决你的问题,请参考以下文章
NOIP 2015 & SDOI 2016 Round1 & CTSC 2016 & SDOI2016 Round2游记