如何从 UISearchBarDisplayController 结果到 detailViewController
Posted
技术标签:
【中文标题】如何从 UISearchBarDisplayController 结果到 detailViewController【英文标题】:How to segue from a UISearchBarDisplayController result to a detailViewController 【发布时间】:2012-02-17 08:33:07 【问题描述】:因此,使用故事板,您可以创建从 UITableViewCell 从第一个 tableViewController 到 detailViewController 的 segue。
不过不太复杂,但是,当 UISearchBarDisplayController 被引入故事板组合时,如何将结果单元格与 detailViewController 分离?
我可以毫无问题地搜索,我按照本教程进行操作:http://clingingtoideas.blogspot.com/2010/02/uitableview-how-to-part-2-search.html
我所能做的就是从搜索中选择一行,它变成蓝色并且没有转到 detailViewController。
我已经实现了方法prepareForSegue,它适用于未搜索的单元格,但无法弄清楚这个。
【问题讨论】:
/你如何/实现了prepareForSeque:sender:
?我在***.com/questions/10033279/… 中描述了一个简单的实现
【参考方案1】:
这是基于@James Chen 评论的解决方案。还根据表所处的状态使用不同的 IndexPath。
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
if ([[segue identifier] isEqualToString:@"toDetail"])
Person *person = nil;
if (self.searchDisplayController.active == YES)
NSIndexPath *indexPath = indexPath = [self.searchDisplayController.searchResultsTableView indexPathForSelectedRow];
NSLog(@"segue - section: %d, row: %d", indexPath.section, indexPath.row);
person = [self.filteredPersonArray objectAtIndex:indexPath.row];
else
NSIndexPath *indexPath = indexPath = [self.tableView indexPathForSelectedRow];
NSLog(@"segue - section: %d, row: %d", indexPath.section, indexPath.row);
person = [self.personArray objectAtIndex:indexPath.row];
[[segue destinationViewController] setPerson:person];
【讨论】:
【参考方案2】:我尝试了您的解决方案,发现 prepareForSegue 被调用了两次 由于生命周期和 didSelect... -> performSegueWithIdentifier.
-
self:prepareForSegue: 目标控制器上的对象已设置
(索引错误)因为
dest:viewDidLoad: 目标控制器视图在之后加载
self:didSelectRow...:索引已知且设置正确。
self:prepareForSegue: 对象现在是正确的,但没有副作用。
然后我专注于 didSelect... 并提出了这个解决方案,我删除了 segue 并以编程方式推送视图:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
DestTableViewController *controller = [self.storyboard instantiateViewControllerWithIdentifier:@"DestViewController"];
CustomObj *custObj = nil;
if (tableView == self.searchDisplayController.searchResultsTableView)
custObj = [filteredListContent objectAtIndex:indexPath.row];
else
storeToDetail = [self.fetchedResultsController objectAtIndexPath:indexPath];
controller.custObj = custObj;
[self.navigationController setNavigationBarHidden:NO];
[self.navigationController pushViewController:controller animated:YES];
// presentViewController::animated:completion is always full screen (see problem below)
然后我遇到了一些问题,因为我遵循了一个 segue 从一个mapView,这导致:
//DestinationViewController
- (IBAction)back:(id)sender
[self.navigationController popToRootViewControllerAnimated:YES]; // list
[self.presentingViewController dismissViewControllerAnimated:YES completion:nil]; // map
这不是这样做的方法,但现在它可以工作。
但是,第一部分简单明了,也许它也适合你?!
【讨论】:
【参考方案3】:好的,我想我明白了,这看起来有点像 hack,但它适用于我的目的:
我正在使用故事板: 我有一个 UITableview 控制器,上面直接带有 UISearchBarDisplayController。无需代码,只需拖放即可。
从那里,我按照本教程让搜索栏正确搜索http://clingingtoideas.blogspot.com/2010/02/uitableview-how-to-part-2-search.html
但是 prepareForSegue: 只会让我显示原始数组中的一个单元格,而不是搜索数组。
所以我使用了 didSelectRowAtIndexPath:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
if (savedSearchTerm)
searchRowSelected = indexPath.row; //<-- the trick that worked
[self performSegueWithIdentifier:@"ShowDetail" sender:self];
searchRowSelected 是我在类顶部声明的 int 变量。
didSelectRowAtIndexPath: 知道我选择了哪一行,但 prepareForSegue 不知道。这就是我需要那个变量的原因。
这就是我在 prepareForSegue 中使用它的方式:
-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
if ([segue.identifier isEqualToString:@"ShowDetail"])
dvc = [segue destinationViewController];
NSIndexPath* path = [self.tableView indexPathForSelectedRow];
int row = [path row];
if (savedSearchTerm) //set the detailViewController with the searched data cell
myDataClass* c = [searchResults objectAtIndex:searchRowSelected];
dvc.myDataClass = c;
else //set the detailViewController with the original data cell
myDataClass* c = [array objectAtIndex:row];
dvc.myDataClass = c;
也使用此代码来清理 savedSearchTerm
-(void) searchDisplayControllerWillEndSearch:(UISearchDisplayController *)controller
[self setSavedSearchTerm:nil];
如果有人有更好的解决方案,我会全力以赴 :)
【讨论】:
检查 searchDisplayController.active 来决定当前的tableview怎么样?以上是关于如何从 UISearchBarDisplayController 结果到 detailViewController的主要内容,如果未能解决你的问题,请参考以下文章
如何将数据从回收器适配器发送到片段 |如何从 recyclerview 适配器调用片段函数
如何从服务器获取和设置 android 中的 API(从服务器获取 int 值)?如何绑定和实现这个