pass data ios properties uiviewcontroller uistoryboardsegue iboutlet

ios - pass data between controllers swift 4



iOS>> prepareForSegue>> ¿La actualización de IBOutlet no funciona? (2)

Intento actualizar una etiqueta en el segundo VC del primer VC dentro del método prepareForSegue.

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { MYSecondViewController* secondVC = (MYSecondViewController*)segue.destinationViewController; secondVC.titleLabel.text = @"First VC Says: You Are Second!!"; //This doesn''t work secondVC.dataPassString = @"First VC Says: You Are Second!!"; //This works + secondVC viewDidLoad }

Si actualizo la etiqueta directamente, no funciona. Si actualizo una propiedad de cadena y luego la asigno a la etiqueta en el segundo VC viewDidLoad, funciona.

¿Significa que después de la llamada a prepareForSegue, el segundo método VC viewDidLoad aún no se llamó?

¿Se llamó algún método init (para que el objeto NSString pudiera pasar)? ¿Si sí, cual?

¿Hay alguna manera de actualizar IBOutlet en el segundo VC desde el primer VC?


Si agrega en esta línea su método " prepareForSegue ":

if(!secondVC.titleLabel) NSLog(@"titleLabel is null and it likely hasn''t been loaded yet")

Verá que la vista no se ha cargado hasta que es hora de que aparezca (lo que sucede después de prepareForSegue ). Es por eso que la propiedad datePassString que está utilizando funciona mientras que las IBOutlets son nulas hasta que se cargue la vista.


La respuesta corta es: No hagas eso.

Debería tratar las vistas de otro controlador de vista como privadas y nunca tratar de manipularlas. Rompe el principio de encapsulación OOD.

Lo que quiere hacer es agregar propiedades (cadena u otro tipo) a su controlador de vista de destino, y establecer ESAS en prepareForSegue. Luego, en el método viewWillAppear de su controlador de vista de destino, copie esos valores de propiedad en las vistas de los controladores de vista.

En su caso, la propiedad datePassString es exactamente lo que desea.

De esta forma, si cambia la estructura de su segundo controlador de vista más adelante y decide mostrar la información en una vista diferente, no romperá el vínculo entre los 2 controladores de vista. El controlador de vista de destino aún puede recuperar los datos de su origen y hacer algo diferente con él.

PD, como dijo el otro cartel, el motivo por el que se establece el segundo valor de V.Vit.LagerTypeLabel.text es que en prepareForSegue, las vistas del controlador de vista de destino aún no se han cargado.