Как перейти от результата UISearchBarDisplayController к detailViewController - PullRequest
5 голосов
/ 17 февраля 2012

Таким образом, используя раскадровку, вы можете создать переход от UITableViewCell от первого tableViewController до detailViewController.

Не слишком сложно, однако, когда UISearchBarDisplayController вводится в микс раскадровки, как вы можете перейтиЯчейка результатов в detailViewController?

Я могу искать без проблем, я следовал этому руководству: http://clingingtoideas.blogspot.com/2010/02/uitableview-how-to-part-2-search.html

Все, что я могу сделать, это выбрать строку из поиска, она становится синейи не идет к detailViewController.

Я реализовал метод prepareForSegue, который работает для неисследованных ячеек, но не может понять это.

Ответы [ 3 ]

4 голосов
/ 07 июня 2013

Вот решение, основанное на комментарии @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 голосов
/ 07 апреля 2012

Я попробовал ваше решение и обнаружил, что prepareForSegue вызывается дважды из-за жизненного цикла и didSelect ... -> executeSegueWithIdentifier.

  1. self: prepareForSegue: объект на контроллере назначения установлен (с неправильным индексом), потому что
  2. dest: viewDidLoad: представление контроллера назначения загружается, после чего
  3. self: didSelectRow ...: индекс известен и правильно установлен.
  4. self: prepareForSegue: объект теперь корректен, но не имеет побочных эффектов.

Затем я сосредоточился на didSelect ... и нашел это решение, в котором я удалил переход и выдвинул представление программно:

- (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)
}

Потом у меня возникли некоторые проблемы с возвращением, потому что я следую за из mapView, что приводит к:

//DestinationViewController
- (IBAction)back:(id)sender
{
    [self.navigationController popToRootViewControllerAnimated:YES]; // list
    [self.presentingViewController dismissViewControllerAnimated:YES completion:nil]; // map
}

это не способ сделать это, но пока это работает.

Тем не менее, первая часть проста и чиста, и, может быть, она вам тоже подойдет?!

0 голосов
/ 17 февраля 2012

Хорошо, я думаю, что понял, это похоже на хак, но это работает для моих целей:

Я использую раскадровку: у меня есть контроллер 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];
}

Если кто-нибудьесть лучшее решение, я все уши:)

...