2012-02-17 9 views
5

Por lo tanto, utilizando el guión gráfico puede crear un segue desde el UITableViewCell desde el primer tableViewController a un detailViewController.Cómo pasar de un resultado UISearchBarDisplayController a un detailViewController

No es demasiado complicado, sin embargo, cuando se introduce un UISearchBarDisplayController en la combinación del guión gráfico, ¿cómo se puede segue la celda de resultados en detailViewController?

soy capaz de buscar sin ningún problema, he seguido este tutorial: http://clingingtoideas.blogspot.com/2010/02/uitableview-how-to-part-2-search.html

Todo lo que puedo hacer es seleccionar una fila de la búsqueda, se vuelve azul y no va a la detailViewController.

He implementado el método prepareForSegue, que funciona para las celdas no buscadas, pero no puede encontrar esta.

+0

/cómo/que han implementado 'prepareForSeque:. Remitente:'? He descrito una implementación simple en http://stackoverflow.com/questions/10033279/prepareforsegue-after-uisearchdisplaycontroller/19814031#19814031 – hop

Respuesta

0

Ok creo que lo tengo, parece como un poco de un truco, pero funciona para mis propósitos:

estoy usando guión gráfico: que tienen un controlador UITableView con UISearchBarDisplayController directamente en la parte superior de la misma. Sin código simplemente arrastre y suelte.

A partir de ahí, he seguido este tutorial para obtener la barra de búsqueda para buscar correctamente http://clingingtoideas.blogspot.com/2010/02/uitableview-how-to-part-2-search.html

Sin embargo prepareForSegue: sería solamente me deja mostrar una célula a partir de la matriz original, no con la matriz de búsqueda.

por lo que utiliza didSelectRowAtIndexPath:

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

searchRowSelected es una variable int que declaré en la parte superior de la clase.

didSelectRowAtIndexPath: sabía qué fila estaba seleccionando, pero prepareForSegue no. Es por eso que necesitaba esa variable.

Esto es como lo he usado en 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; 
    } 
} 
} 

También utilice este código para limpiar savedSearchTerm

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

Si alguien tiene una solución mejor soy todo oídos :)

+5

¿Qué tal si se busca searchDisplayController.active para decidir la tabla actual? –

2

Intenté su solución y encontré que prepareForSegue se llama dos veces debido al ciclo de vida y didSelect ... -> performSegueWithIdentifier.

  1. auto: prepareForSegue: objeto en el controlador destino se establece (con índice incorrecto) porque
  2. dest: viewDidLoad: la vista del controlador de destino se carga después de lo cual
  3. auto: didSelectRow ...: el índice es conocido y establecido adecuadamente
  4. self: prepareForSegue: el objeto ahora es correcto pero no tiene ningún efecto secundario.

Me centré en didSelect ...y se acercó con esta solución en la que he eliminado el segue y empujé la vista mediante programación:

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

entonces he tenido algunos problemas que se remontan porque sigo un segue de un MAPview, que conducen a:

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

que no es la manera de hacerlo, pero por ahora funciona.

Sin embargo, la primera parte es fácil y limpia, ¡¿y tal vez te funcione también?

4

Aquí está la solución que se basa en el comentario de @James Chen. También el uso de un IndexPath diferente dependiendo de en qué estado se encuentra en la tabla

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

    } 
} 
Cuestiones relacionadas