2012-06-29 9 views
10

Soy relativamente nuevo en Objective-C y vengo de un fondo Java, por lo tanto, me parece bastante desalentador la noción de punteros y errores de compilación no bien explicados.Accediendo a la propiedad en prepareForSegue de UIViewController

Tengo una clase que implementa un delegado con el método jsonControllerDidLinkedInAuth. Cada vez que el delegante enviar un mensaje a esta clase, haciéndose pasar y una url (NSURL *), estoy tratando de asignar el url a una propiedad AuthURL, cuando estas operaciones acabados llaman el performSegueWithIdentifier, que se ejecuta a su vez el prepareForSegue (en lo que respecta a mi comprensión de esto).

Esto no parece funcionar, ya que estoy recibiendo una:

App [3278: 13517] * Terminación de aplicación debido a excepción no detectada 'NSInvalidArgumentException', razón: '- [UINavigationController setUrlAddress :]: selector no reconocido enviado a instancia 0x6acab00'

mensaje de error que termina la aplicación con SIGABRT.

Ambos métodos residen en la misma clase, que es un UINavigationController y apunta a otro UINavigationController. El compilador me apunta al [vc setUrlAddress:self.authUrl]; del segundo método.

- (void)jsonControllerDidLinkedInAuth:(JsonController *)controller :(NSURL *)url { 
    authUrl = url; 
    if (authUrl != nil) { 
     [self performSegueWithIdentifier:@"LinkedInAuth" sender:self]; 
    } else { 
     NSLog(@"Auth URL is null"); 
    } 
} 


- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    if ([[segue identifier] isEqualToString:@"LinkedInAuth"]) { 
     // Get destination view 
     LinkedInViewController *vc = [segue destinationViewController]; 
     NSLog(@"The auth url from prepareForSegue in SignupViewControlle: %@", self.authUrl); 
     [vc setUrlAddress:self.authUrl]; 
    } 
} 

Lo que parece ser el problema es que por alguna razón no puedo acceder a la propiedad de la clase AuthURL actualmente soy. Intenté con authUrl, [self authUrl] y self.authUrl pero nada de esto parece hacer el trabajo. Las propiedades están sintetizadas, pero también he notado una pequeña sugerencia: "UINavigationController setUrlAddress", ¿no debería ser esto un LinkedInViewController como se define en el método anterior? Intenté lanzar (LinkedInViewController) [segue destinationViewController], pero luego recibí un mensaje que me informaba que no se podía convertir en un puntero.

Cualquier ayuda sería muy apreciada. Gracias por leer.

Edición 1: El NSLog justo encima de setUrlAddress devuelve self.authUrl. Supongo que debe ser un problema de visibilidad, pero no estoy seguro de cómo resolverlo.

Respuesta

21

Si su controlador de vista está incrustado en un UINavigationController, segue.destinationViewController se refiere a ese controlador de navegación. Esto es lo que se podría utilizar:

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

     if ([[segue identifier] isEqualToString:@"LinkedInAuth"]) { 
      UINavigationController *navigationController = (UINavigationController *)segue.destinationViewController; 
      LinkedInViewController *linkedInViewController = [[navigationController viewControllers] lastObject]; 
      linkedInViewController setUrlAddress:self.authUrl]; 
     } 
} 

Y si tiene más de 1 segue que las transiciones a un controlador de vista incrustada en un UINavigationController, por lo general agregar esto al comienzo de prepareForSegue:sender:

if ([segue.destinationViewController isKindOfClass:[UINavigationController subclass]]) 
     id vc = [[(UINavigationController *)segue.destinationViewController viewControllers] lastObject] 

Ahora vc contiene el controlador de vista que realmente le interesa, por lo que no tiene que copiar y pegar el molde para cada transición.

+0

Gracias, esto funciona como un encanto!Además, su mensaje me ahorró mucha depuración ya que hay pocos otros ViewControllers que se comporten de manera similar. –

+0

De nada. Consulte mi respuesta actualizada para obtener una forma fácil de acceder al controlador de vista que le interesa sin tener que realizar el comando cada vez. –

0

Parece que no está asignando el delegado, lo que debe hacer para que el patrón de delegado funcione. Intente agregar vc.delegate = self a su prepareForSegue.

+0

El delegado fue asignado en otro método que inició la autenticación, luego el delegador (no se muestra en mis fragmentos de código) llamó al jsonControllerDidLinkedInAuth :, pero gracias de todos modos :) Mi problema estaba relacionado con tener mi ViewController incrustado en un NavigationController, como señaló por Scott. –

Cuestiones relacionadas