2011-12-17 15 views
6

Mi problema parece ser un problema genérico, pero no parece encontrar una respuesta para él.Navegación condicional Segue desde UITableViewCell según la respuesta a UIAlertView

Tengo una situación en la que cuando el usuario toca una UITableViewCell personalizada, me gustaría mostrar una alerta y luego basándome en la respuesta a la alerta, permanezco en la misma vista (usuario seleccionando cancelar) o visualizo otra vista (si el usuario selecciona proceder). Y me gustaría hacer esto usando la función de guion gráfico & segues.

¿Cómo podría uno hacer esto? ¿Tienes que hacer esto a la vieja usanza?

Respuesta

11

@user, solo crea la alertaVea la moda antigua; Sé de cualquier característica del guión gráfico para hacer esto de manera diferente. Donde el guión gráfico puede ayudar es con los segues. Puede llamar a los segues programáticamente. Con su botón de cancelación de vista de alerta, puede simplemente regresar (es decir, no hacer nada). Para la otra opción, para mostrar otra vista, puede llamar programáticamente un cambio para pasar a la vista deseada. Si no tiene la transición adecuada ya definida por algún otro motivo en su guión gráfico, simplemente cree un botón y utilícelo para crear el intervalo y asígnele un nombre. Nombra el segue haciendo clic en él en el guión gráfico y usa el inspector de atributos para darle su nombre (identificador). Luego, oculta el botón o colócalo fuera de la vista. Normalmente coloco este tipo de botón en la barra de herramientas y uso espaciadores para mantenerlos fuera de la vista. He aquí algunos ejemplos de código:

Llame al segue desde el punto de vista de alerta delegado de la siguiente manera:

[self performSegueWithIdentifier: @"done" sender: self]; 

también implementan este método para hacer cualquier tarea necesaria para prepararse para el segue:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
if ([[segue identifier] isEqualToString:@"done"]) 
    { 
     // [[segue destinationViewController] setManagedObjectContext:self.managedObjectContext]; 
     // [[segue destinationViewController] setSelectedClient:selectedClient]; 
    } 
} 
+1

eso es lo que hice; Parecía un hack, pensé que había una manera más obvia que había pasado por alto. –

+1

@usuario, si usted o alguien más leyendo esto descubre una mejor manera de hacerlo, háganoslo saber. –

8

Usted puede crear segmentos directamente desde el StartingViewController a múltiples destinationViewControllers que luego pueden ser "ejecutados" programáticamente. No es necesario crear botones ocultos para ellos, lo que parece un truco.

+0

+1, pero ¿cómo se crean los segmentos directamente desde el StartingViewController a múltiples destinationViewControllers? ¿Quiere decir simplemente Ctrl-arrastrar entre ver controladores y nombrar los segues? – brainjam

+1

Sí, quiero decir que solo tiene que presionar Ctrl y arrastrar entre los controladores de vista. El punto principal es que no selecciona un elemento del controlador de vista dentro de una vista del guión gráfico, pero selecciona el controlador de vista real y Ctrl-arrastra a las otras vistas desde él. Lo hice yo mismo y funcionó muy bien. – DataJock

+0

¡Agradable! No más botones fantasmas para mí. –

4

OK Se me ocurrió una solución acorde con el guión gráfico que me gusta.

Ejemplo:

Mi tableview tiene 2 secciones, agrupados, y las células son prototipo dinámico. La sección 0 contiene una fila/UITableViewCell & No quiero que se segue. La sección 1 contiene varias celdas que quiero activar segue & profundizar en los detalles.

En Storyboard:

  • Quité el segue que une el tableviewcell al controlador de vista de destino.
  • Hice un segue 'genérico' que vincula el controlador de vista de fuente directamente al controlador de vista de destino.
  • En los atributos en el segue, configuré el identificador ('EditTimePeriod') y establecí el tipo en Push (supongo que Modal funcionaría de la misma manera).

En el controlador de vista fuente:

  • En el método prepareForSegue manejé tanto el segue común 'AddTimePeriod' controlo-arrastrado de mi UIBarButtonItem (Add), junto con el 'genérico' (vc -> vc) segue 'EditTimePeriod'.

    - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { 
    
        // handle the click of the 'Add' bar button item  
        if([segue.identifier isEqualToString:@"AddTimePeriod"]) { 
         TimePeriodViewController* tpvc = (TimePeriodViewController*)segue.destinationViewController; 
         tpvc.delegate = self; 
         // database & entity stuff for adding the new one to the mOC, etc 
        } 
    
        // handle the click of one of the 'editable' cells - 
        if([segue.identifier isEqualToString:@"EditTimePeriod"]) { 
         TimePeriodViewController* tpvc = (TimePeriodViewController*)segue.destinationViewController; 
         tpvc.delegate = self; 
         TimePeriod * newTP = [self.timePeriodArray objectAtIndex:self.tableView.indexPathForSelectedRow.row]; 
         tpvc.timePeriod = newTP; 
        } 
    } 
    
  • Entonces implementó el tableView: Método didSelectRowAtIndexPath, y poner mi estado aquí. Si la fila seleccionada se encontraba fuera de la sección cero Llamé al segue EditTimePeriod manualmente, definiendo el remitente como el tableviewcell seleccionado:

    - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 
    
        if(self.tableView.indexPathForSelectedRow.section!=0){ 
         [self performSegueWithIdentifier:@"EditTimePeriod" sender:[tableView cellForRowAtIndexPath:indexPath]]; 
        } 
    
        [self.tableView deselectRowAtIndexPath:indexPath animated:YES]; 
    
        return;  
    } 
    

estaría bien para codificar la celda en la sección 0, por lo que no es seleccionable ¡en primer lugar! Espero que esto ayude sin embargo.

** y luego, 5 minutos después, volví a mirar y me di cuenta de que podía mover los datos de la sección 0 al encabezado de sección, que es más intuitivo y no se usaba de todos modos. dejando el diseño abierto para una transición estándar desde cada mesa de visión sin necesidad de ninguna condición/verificación. Fue un buen ejercicio de todos modos :)

Cuestiones relacionadas