Domanda

Quindi, utilizzando storyboard è possibile creare un segue dalla UITableViewCell dal primo tableViewController ad un detailViewController.

Non troppo complicato, tuttavia, quando un UISearchBarDisplayController viene introdotto nella miscela storyboard, come si può Segue la cellula risultati alla detailViewController?

Sono in grado di cercare senza un problema, ho seguito questo tutorial: http://clingingtoideas.blogspot.com/2010/02/uitableview-how-to-part-2-search.html

Tutto quello che posso fare è selezionare una riga dalla ricerca, diventa blu e non va al detailViewController.

Ho implementato il metodo prepareForSegue, che lavora per la non cercato cellule, ma non riesco a capire questo.

È stato utile?

Soluzione 3

Ok penso ho preso, sembra un po 'di hack, ma funziona per i miei scopi:

Sto usando storyboard: Ho un regolatore di UITableView con UISearchBarDisplayController direttamente su di esso. Nessun codice appena drag and drop.

Da lì, ho seguito questo tutorial per ottenere la barra di ricerca per cercare correttamente http://clingingtoideas.blogspot.com/2010/02/uitableview-how-to-part-2-search.html

Tuttavia prepareForSegue:. Avrebbe lasciato solo mi visualizzo una cella della matrice originale, non con la matrice di ricerca

Così ho usato didSelectRowAtIndexPath:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (savedSearchTerm) {
    searchRowSelected = indexPath.row;  //<-- the trick that worked
    [self performSegueWithIdentifier:@"ShowDetail" sender:self];
}
}

searchRowSelected è una variabile int che ho dichiarato al vertice della classe.

didSelectRowAtIndexPath: sapeva quale riga stavo selezionando, ma prepareForSegue non lo fece. Ecco perché ho bisogno di quella variabile.

Questo è il modo che ho usato in 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;
   }
}
}

Anche utilizzare questo codice per ripulire savedSearchTerm

-(void) searchDisplayControllerWillEndSearch:(UISearchDisplayController *)controller{
    [self setSavedSearchTerm:nil];
}

Se qualcuno ha una soluzione migliore sono tutto orecchie:)

Altri suggerimenti

Ecco la soluzione che si basa sul commento di @James Chen. Anche utilizzando un IndexPath differente a seconda dello stato della tabella è in.

- (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];   

    }
}

ho provato la soluzione e ha scoperto che prepareForSegue viene chiamato due volte a causa del ciclo di vita e didSelect ... -.> performSegueWithIdentifier

  1. auto: prepareForSegue: oggetto su controller di destinazione è impostata (Con indice sbagliato) perché
  2. dest: viewDidLoad: la vista del regolatore di destinazione viene caricato dopo che
  3. auto: didSelectRow ...:. L'indice è nota e impostata correttamente
  4. auto: prepareForSegue:. Oggetto è ora corretto, ma non ha alcun effetto collaterale

Ho poi focalizzata sulla didSelect ... e si avvicinò con questa soluzione in cui ho cancellato la segue e spinse la vista a livello di codice:

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

Poi ho avuto qualche problema a tornare perché seguo un segue da un MapView, che portano a:

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

, che non è il modo per farlo, ma per ora funziona.

Tuttavia, la prima parte è facile e pulita, e forse funziona anche per te?!

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top