如何从UISearchBarDisplayController结果转换为detailViewController

时间:2012-02-17 08:33:08

标签: ios uisearchbardisplaycontrol

因此,使用storyboard,您可以从UITableViewCell创建一个segue,从第一个tableViewController到detailViewController。

不是太复杂,但是当故事板组合中引入了UISearchBarDisplayController时,如何将结果单元格转换为detailViewController?

我能够毫无问题地进行搜索,我遵循了本教程:http://clingingtoideas.blogspot.com/2010/02/uitableview-how-to-part-2-search.html

我所能做的就是从搜索中选择一行,它变为蓝色,不会转到detailViewController。

我已经实现了prepareForSegue方法,该方法适用于未搜索的单元格,但无法弄清楚这个。

3 个答案:

答案 0 :(得分:4)

这是基于@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];   

    }
}

答案 1 :(得分:2)

我尝试了你的解决方案,发现prepareForSegue被调用了两次 由于生命周期和didSelect ... - > performSegueWithIdentifier。

  1. self:prepareForSegue:设置目标控制器上的对象 (索引错误)因为
  2. dest:viewDidLoad:加载目标控制器视图
  3. self:didSelectRow ...:索引已知且设置正确。
  4. self:prepareForSegue:对象现在正确但没有副作用。
  5. 然后我专注于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
    }
    

    这不是这样做的方法,但现在可行。

    然而,第一部分既简单又干净,也许它也适合你?!

答案 2 :(得分:0)

好吧我觉得我明白了,它似乎有点像黑客但它适用于我的目的:

我正在使用故事板: 我有一个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];
}

如果有人有更好的解决方案我会全力以赴:)