2009-06-05 26 views
11

He escrito una subclase UITabBarController (llamada MainViewController) y he agregado algunas variables de instancia, específicamente un lugar de tipo Venue. Cada pestaña del MainViewController necesita acceder a la variable de sede del MainViewController. En la primera pestaña, una subclase UIViewController nombrado HomeViewController, escribí mi método viewDidLoad y traté de salida a NSLog con tanto ...Acceso a las propiedades del controlador de vista principal (personalizado)

NSLog(@"%@", self.parentViewController.venue.name); 

y

NSLog(@"%@", self.tabBarController.venue.name); 

Pero XCode da el error

error: request for member 'venue' in something not a structure or union 

Puedo acceder a la propiedad del lugar desde dentro de MainViewController bien, así que he descartado un error allí. El simulador de iPhone ve ambos self.parentViewController y self.tabBarController como una instancia de MainViewController. La línea ...

NSLog(@"%@", self.tabBarController); 

salidas ...

2009-06-05 17:54:46.502 Venue[29729:20b] <MainViewController: 0x536600> 

Ya que es visto como un ejemplo MainViewController, no creo que el uso de la fundición ayudaría. ¿Es mi única otra opción inicializar el HomeViewController con una copia del lugar o simplemente estoy haciendo algo completamente incorrecto con 'self.parentViewController.venue.name'? Gracias, Rob

+0

¿Ha configurado correctamente el lugar y el nombre como propiedades? es decir, accedores KVC que cumplen con los requisitos o utiliza @property y @synthesize? – Abizern

Respuesta

26

Estás haciendo algo completamente incorrecto. parentViewController se declara como UIViewController. NSLog ing produce su tipo real debido a las maravillas del polimorfismo.

UIViewController no tiene un miembro Venue. Su MainViewController lo hace. Lanzarlo es, de hecho, la respuesta correcta. Asegúrese de importar MainViewController.h también.

#import "MainViewController.h" 
[...] 
NSString *name = ((MainViewController *)self.parentViewController)).venue.name; 

Asegúrese también, por supuesto, que venue se declara como un @property de MainViewController y name es una @property de Venue.

+0

Fantástico, gracias. Intenté hacer el casting justo antes pero arruiné mis corchetes. – rob5408

+1

Gran respuesta. Sin embargo, sugeriría que la primera oración es innecesaria. Esa fue una buena pregunta. – Darkenor

+1

Para ser justos, su pregunta fue "¿Es mi única otra opción inicializar el HomeViewController con una copia del lugar o simplemente estoy haciendo algo completamente incorrecto con 'self.parentViewController.venue.name'?" –

1

Su declaración NSLog() es "verlo" como MainViewController porque eso es lo que realmente es el objeto. El problema que tienes, sin embargo, es que el compilador no se da cuenta de esto porque la propiedad parentViewController está declarada como simple UIViewController. Aunque en realidad está devolviendo una subclase, en la medida en que el compilador sabe que está intentando llamar a ese método en un UIViewController, se va a quejar. Lanzarlo a MainViewController resolverá el problema.

2
int currentVCIndex = [self.navigationController.viewControllers indexOfObject:self.navigationController.topViewController]; 

//previous view controller 
AccountViewController *account = (AccountViewController *)[self.navigationController.viewControllers objectAtIndex:currentVCIndex - 1]; 

account.property = object; 
[account doSmthng]; 
Cuestiones relacionadas