2011-12-10 5 views
16

Espero no estar preguntando algo que ya ha sido respondido (pero no encontré ninguna respuesta a esto, así que con suerte no lo estoy).performSegueWithIdentifier y sharedData

Tengo una aplicación en la versión actual de xcode, usando segues y navigationController. Necesito pasar datos de una vista a la otra. ¿Cuál es la forma más fácil de hacer esto? Me encontré con algo de sharedData que posiblemente podría engancharse al método performSegueWithIdentifier pero no sé cómo usarlo (o si es la opción correcta para hacerlo así).

Gracias

+1

Si desea utilizar su nombre real, modifique su nombre de usuario, no coloque una línea adicional en las publicaciones. :) – mac

Respuesta

35

A segue tiene dos controladores de vista: sourceViewController y destinationViewController. Cuando UIKit ejecuta un segue, envía un mensaje prepareForSegue:sender: al VC de origen. Puede anular ese método en su subclase de controlador de vista para pasar datos al VC de destino.

Por ejemplo, suponga que tiene un controlador de vista maestro con una vista de tabla de películas, y cuando el usuario hace clic en una fila en la vista de tabla, desea pasar a un controlador de vista de detalle para la película.

@implementation MasterViewController 

... 

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    DetailViewController *detailVC = segue.destinationViewController; 
    NSIndexPath *selectedPath = [self.tableView indexPathForSelectedRow]; 
    detailVC.movie = [self movieForIndexPath:selectedPath]; 
} 

Esto se explica en el video Introducing Interface Builder Storyboarding de la WWDC 2011.

Es también digno de mención que cuando el origen del segue es una célula vista de tabla, o el botón de accesorios de una célula vista de tabla, el argumento sender de prepareForSegue:sender: es la celda de vista de tabla.

10

Creo que la mejor manera es importar encabezado para el controlador de vista que se mostrará en el controlador que está ejecutando segue. Y luego usarlo de descriptores de acceso u otros métodos para pasar los datos necesarios dentro prepareForSegue:

// In FirstViewController.h 

#import "SecondViewController.h" 

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { 

    if ([[segue identifier] isEqualToString:@"SegueToSecondViewController"]) { 
     // Get destination view controller and don't forget 
     // to cast it to the right class 
     SecondViewController *secondController = [segue destinationViewController]; 
     // Pass data 
     secondController.dataArray = self.someDataArray; 
     secondController.name = @"Fancy name"; 
    } 
} 

Cuando se desea que los datos de vuelta de segunda a primera, mejor utilizar delegado:

// In FirstViewController.h 

#import "SecondViewController.h" 
#import "SecondViewControllerDelegate.h" 

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { 

    if ([[segue identifier] isEqualToString:@"SegueToSecondViewController"]) { 

     SecondViewController *secondController = [segue destinationViewController]; 

     // Declare first view controller as a delegate 
     secondController.delegate = self; 

     // Pass data 
     secondController.dataArray = self.someDataArray; 
     secondController.name = @"Fancy name"; 
    } 
} 

// Second controller's delegate method,controller 
// ie. used to return data after second view is dismissed 
- (void)secondControllerFinishedSomeTask:(NSArray *)someReturnedData { 
    // Do something with returned data 
} 
+0

manera genial, gracias chicos! – Ondrej

2

Cuando se desea que los datos de vuelta del segundo al primero, mejor forma es use Unwind Segues.

Cuestiones relacionadas