如何从 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 适配器调用片段函数

如何从 Firebase 获取所有设备令牌?

如何直接从类调用从接口继承的方法?

如何从服务器获取和设置 android 中的 API(从服务器获取 int 值)?如何绑定和实现这个

如何从Mac从android studio中的fabric注销? [复制]

如何从设备中获取 PDF 文件以便能够从我的应用程序中上传?