2012-01-10 24 views
10

estoy empezando ahora con Xcode 4.2 para el iOS5 y hay algunos cambios y ahora estoy atravesando un problema que no puedo encontrar una manera de solucionarla .Xcode 4.2 iOS 5: Múltiples segues de un UITableView

Estoy haciendo un ejemplo con un UITablwView que se llena programáticamente con 2 Secciones, 1ra sección con solo 1 Fila, y 2da Sección con 3 Filas.

Mi objetivo es seleccionar una fila de la tabla, y en base a esa fila, el usuario será redirigido a diferentes puntos de vista.

Por ejemplo: sección de selección de fila 0 0, aplicación empuja a ver 1 - ajuste del nombre // sección de selección de fila 1 0, aplicación empuja a ver 3 - establecer

a la antigua dirección, esto es bastante simple, solo se necesita iniciar un UIViewController con initWithNibName y luego presionar la vista.

Ahora con StoryBoard todo cambia, o al menos creo que cambia porque no puedo ver cómo obtener el mismo resultado ya que no puedo establecer múltiples segue desde tableView a diferentes UIViewControllers ... y hacer a la manera de la vieja usanza no puedo ver dónde puedo obtener los nombres de NIB de las vistas en la storyBoard para iniciar un UIViewController para empujar.

¿Alguien sabe cómo llegar a este resultado ??

Respuesta

25

definir dos segues "genéricas" (identificado como "SEGUE1" y "segue2", por ejemplo) en el guión gráfico de su controlador de vista fuente, una a cada controlador de vista de destino. Estos segmentos no se asociarán con ninguna acción.

Entonces, condicionalmente realizar las segues en su UITableViewDelegate:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    // Conditionally perform segues, here is an example: 
    if (indexPath.row == 0) 
    { 
     [self performSegueWithIdentifier:@"segue1" sender:self]; 
    } 
    else 
    { 
     [self performSegueWithIdentifier:@"segue2" sender:self]; 
    } 
} 
+2

fantástico respuesta. Funciona para mí también. Debe ser aceptado como respuesta. – mm24

16

que tienen el mismo problema que tú. El problema es que no puede vincular su tableViewCell a múltiples controladores de vista. Sin embargo, puede vincular su propia vista de fuente a múltiples controladores de vista.

  1. de control y arrastre el punto de vista del controlador maestro (en lugar de la célula vista de tabla) desde el visor de escena para que sea controlador de vista que desea vincular. Puedes hacer esto tanto como quieras. Tenga en cuenta que la transición que se muestra en la escena del controlador de la vista fuente debe ser algo así como "Empujar Segue desde el Controlador de Vista Root ..." en lugar de "Insertar Segue desde NavCell a ...".

  2. Identificar cada enlace segue un nombre único como "toDetailView1"

  3. Por último, la costumbre la selección en sus controladores de vista de origen:

    - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
    { 
        if (indexPath.row % 2 == 1) { 
         [self performSegueWithIdentifier:@"toDetailView1" sender:self]; 
        } else { 
         [self performSegueWithIdentifier:@"toDetailView2" sender:self]; 
        } 
    } 
    
+0

+1 resolvió mi problema –

+0

¡Asombroso! ¡Resolvió mi problema! Una pregunta ... ¿Cómo puedo usar lo mismo para más de dos segues? Digamos que tengo 7 celdas tableView. ¿Cómo usaría eso además del código que me proporcionó? –

0

Al igual que @ 陳仁 乾 y @Marco explicada fue completamente correcto. Para hacer que todo sea un poco más fácil, le recomendaría usar un solo NSArray que se inicializará cuando viewDidLoad.Sólo el nombre de los segues el mismo que su UIViewControllers, de esta manera usted puede ver una descripción correcta de lo UIViewControllers se puede elegir y también se puede realizar la segues de esta NSArray:

(En realidad no estoy seguro de si se puede causará ningún problema llamando a la segue el mismo que el UIViewController al que desea llamar. Por favor, hágamelo saber si esto es BadPractise)

viewDidLoad

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    _arraySessions = [[NSArray alloc] initWithObjects: 
         @"MyViewControllerName", nil]; 
} 

cellForRowAtIndexPath

- (UITableViewCell *)tableView:(UITableView *)tableView 
     cellForRowAtIndexPath:(NSIndexPath *)indexPath{ 
    UITableViewCell *cell = 
    [tableView dequeueReusableCellWithIdentifier:@"overviewCell" 
            forIndexPath:indexPath]; 

    [cell.textLabel setText:_arraySessions[indexPath.row]]; 

    return cell; 
} 

didSelectRowAtIndexPath

- (void)tableView:(UITableView *)tableView 
     didSelectRowAtIndexPath:(NSIndexPath *)indexPath{ 
    [self performSegueWithIdentifier:_arraySessions[indexPath.row] 
           sender:self]; 
} 
Cuestiones relacionadas