ios - for - segue: rareza del controlador de vista de destino
override func prepare (4)
En mi aplicación, utilizo un guión gráfico y segues, y a menudo paso los datos al controlador de vista de destino antes de hacer el cambio, de la siguiente manera:
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if ([segue.destinationViewController respondsToSelector:@selector(setMyData:)]) {
[segue.destinationViewController performSelector:@selector(setMyData:)
withObject:myData];
}
}
Funciona en todas partes, excepto en un solo lugar. Se llama al selector, se configuran los datos, pero cuando se completa la transición y aparece el controlador de destino, no tiene los datos que acabo de configurar. Después de imprimir la identificación del controlador de vista en los controladores de vista de origen y destino, encontré que segue.destinationViewController
en el código anterior es una instancia DIFERENTE del controlador de vista que la que se muestra. ¿Que está pasando aqui?
[UPDATE 1] Miré en el ciclo de vida del controlador de vista de destino, y primero se carga durante la ejecución de segue, ¡pero DESPUÉS de establecer la propiedad en él! Esto significa que cuando performSelector
, ¡el objeto del controlador de vista no se inicializa! Esta es la razón por la cual los datos que establezco no se quedan. No entiendo por qué es este el caso, y por qué este mismo enfoque funciona en las otras partes de mi aplicación.
[ACTUALIZACIÓN 2] Publicar el código de setMyData
por solicitud. Al principio no tenía este método en absoluto, porque locationToOpen
es una propiedad pública. Solo lo agregué para asegurarme de que se llame y para imprimir la información de depuración.
- (void)setMyData:(MyData *)myData
{
DLog(@"self: %@", (id)self);
_myData = myData;
}
Lo haría de la siguiente manera:
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if ([segue.identifier isEqualToString:@"NextSegue"])
{
DestinationViewController *dest = [segue destinationViewController];
dest.myData = self.myData;
}
}
Y en DestinationViewController.h, debe crear una propiedad:
#import <UIKit/UIKit.h>
@interface DestinationViewController : UIViewController
@property (nonatomic, strong) NSObject *myData;
@end
Y también, asegúrese de sintetizar la propiedad myData en DestinationViewController.m -
@interface DestinationViewController ()
@end
@implementation DestinationViewController
@synthesize myData = _myData;
// other methods here
@end
Sé que este hilo es viejo y que se debe encontrar una solución. Pero dado que la solución final no está publicada aquí, me gustaría enumerar una de las causas posibles (que es la de mi caso). Tuve el mismo problema, tratando de establecer la variable en el controlador de vista de destino del segue. La causa principal es que olvidé instanciar ([[Class alloc] init]) la variable del objeto. Lo necesito en mi caso porque estoy configurando las propiedades del objeto en lugar de señalar a otro objeto. Espero que esto ayude.
Tuve el mismo problema. Resultó para mí que la propiedad ViewController de destino que estaba configurando en mi código prepareForSegue: se declaró como débil porque había copiado y pegado la propiedad de uno que InterfaceBuilder creó automáticamente, pero el mío no era un objeto Storyboard. Así que mi propiedad estaba siendo liberada y puesta a cero por ARC a la salida de prepareForSegue :. Convertirlo en una propiedad no débil lo solucionó.
Tuve un problema similar cuando el ViewController que estaba haciendo el cambio cambió en algún punto extraño, después de un vistazo un poco, parece que el segue creó un nuevo ViewController.
Para resolver el problema de transmisión de datos, utilicé las notificaciones.