Objective-C (iOS): prepareForSegue no pasará mis datos al VC de destino

CV1 = NewGameViewController
CV2 = GameViewController

NewGameViewController.m

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if( [segue.identifier isEqualToString:@"newGameSegue"]) {
    GameViewController *gameVC = (GameViewController *)segue.destinationViewController;

    NSArray *array = [self nameArrayForTextFieldArray:self.namePicker.textFieldArray withColon:YES];
    gameVC.nameArray = [[NSArray alloc] initWithArray:array];
}

-(NSArray *)nameArrayForTextFieldArray:(NSArray *)array withColon:(BOOL *)bool básicamente devuelve un nsarray de cadenas dado un nsarray de campos de texto. withcolon es un bool de si desea o no que las cadenas tengan dos puntos al final.

cuando depuro mi código, el _nameArray ivar en gameVC todavía lee nil después de que se llama cada línea aquí... ¿alguien puede ayudarme aquí?

preguntado el 04 de julio de 12 a las 05:07

3 Respuestas

UIKit invoca el método prepareForSegue cuando está a punto de realizarse un cambio de una pantalla a otra. Nos permite dar datos al nuevo controlador de vista antes de que se muestre. Por lo general, lo hará configurando sus propiedades.

El nuevo controlador de vista se puede encontrar en segue.destinationViewController. Si GameViewController incrusta el controlador de navegación, el nuevo controlador de vista no será GameViewController sino el controlador de navegación que lo incrusta. Para obtener el objeto GameViewController, podemos mirar la propiedad topViewController del controlador de navegación. Esta propiedad se refiere a la pantalla que está actualmente activa dentro del controlador de navegación.

Para enviar un objeto al nuevo controlador de vista, puede usar esta solución usando performSegueWithIdentifier:

Por ejemplo, si queremos realizar un segue pulsando un UIButton Podemos hacer esto:

En la MyViewController.h creamos una IBAction (conectada a UIButton), arrastrando el botón desde el guión gráfico al código:

- (IBAction)sendData:(id)sender;

In MyViewController.m implementamos el método:

- (IBAction)sendData:(id)sender
{
    NSArray *array = [self nameArrayForTextFieldArray:self.namePicker.textFieldArray withColon:YES];
    [self performSegueWithIdentifier:@"newGameSegue" sender:array];
}


- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([segue.identifier isEqualToString:@"newGameSegue"]) {
        UINavigationController *navigationController = segue.destinationViewController;
        GameViewController *controller = (GameViewController *)navigationController.topViewController;
        controller.nameArray = sender;
    }
}

Respondido 06 Jul 12, 08:07

para este método sendData, ¿pretende usarlo como un botón IBAction for que llama al segue? - BrianSan

Sí, puse un método genérico. La idea es tener un método que se invoque para un evento específico. Pulsando un botón clic en una celda y así sucesivamente. - andreapavan

¿GameViewController está integrado en un controlador de navegación? En ese caso, su propiedad DestinationViewController es del tipo UINavigationController, no GameViewController. Puede acceder a GameViewController llamando [segue.destinationViewController.viewControllers lastObject].

Respondido 04 Jul 12, 05:07

Supongo que ha hecho un NSLog (o lo examinó en el depurador) de array inmediatamente antes de establecer gameVC.nameArray. Realmente quieres asegurarte de que se está configurando de la manera que crees. Es sorprendente la cantidad de veces que pasé depurando algo como esto solo para darme cuenta de que el problema estaba en mi equivalente a nameArrayForTextFieldArray. O un error tipográfico en el nombre del identificador de segue. O cosas aleatorias como esa.

Asumiendo que está bien, entonces un par de cosas son posibles:

  1. ¿Cómo está tu nameArray propiedad definida en GameViewController? si no es un strong referencia (o una copy), entonces cuando su array cae fuera del alcance, será desasignado. Creo que esto se manifestaría de forma ligeramente diferente, pero vale la pena confirmarlo.

  2. Además, he visto situaciones en las que un controlador como GameViewController podría tener cierta confusión entre varios ivars y propiedades (por eso yo nunca definir ivars para mis propiedades... dejo @synthesize Haz eso).

  3. Supongo que no estás usando un setter personalizado para nameArray. Solo quiero asegurarme. Sin embargo, si es así, compártalo también.

En pocas palabras, ¿puede mostrarnos todas las referencias a nameArray en tu @interface of GameViewController así como en su @synthesize ¿declaración?

Respondido 04 Jul 12, 06:07

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.