Valor de parentViewController

Esta clase es una subclase de UITabBarViewController. En mi archivo de controlador de vista principal de init tengo esto:

UIBarButtonItem *button1 = [[UIBarButtonItem alloc] 
                                 initWithTitle:@"Button1" 
                                 style:UIBarButtonItemStyleBordered 
                                 target:self 
                                 action:@selector(button1:)];

self.navigationItem.rightBarButtonItem = button1;

[button1 release];

Y el método:

-(IBAction)button1:(id)sender {  

if (self.nvc == nil) {
    ChildViewController *vc = [[ChildViewController alloc] init];   
    self.nvc = vc;
    [vc release];
}

[self presentModalViewController:self.nvc animated:YES];

Quiero obtener un valor del parentviewcontroller en mi clase childviewcontroller, que también es una subclase UITabBarViewController.

¿Cómo hago esto? He intentado varias horas y solo obtengo una referencia nula.

El objeto que quiero obtener (que es una propiedad del padre) es un NSString.

Gracias por adelantado

preguntado el 09 de enero de 11 a las 00:01

2 Respuestas

Hay muchas formas de hacer esto. Lo más fácil sería agregar una propiedad a ChildViewController que apunta a su controlador de vista principal. Podrías llamarlo delegate. Entonces el método se verá así:

-(IBAction)newbuilding:(id)sender {
    if (self.nvc == nil) {
        ChildViewController *vc = [[ChildViewController alloc] init];   
        vc.delegate = self;
        self.nvc = vc;
        [vc release];
    }
    [self presentModalViewController:self.nvc animated:YES];
}

Luego, desde la instancia de ChildViewController puede acceder self.delegate.someProperty.

También hay formas de obtener el controlador de vista principal sin su propia referencia explícita (normalmente self.tabBarController, self.navigationController dependiendo del contexto), pero el método anterior es infalible, comprensible y fácil de depurar.

Respondido 04 Jul 11, 15:07

La forma más limpia probablemente sería crear un protocolo ChildViewControllerDelegate que implemente el controlador de vista principal. Este es un idioma común en el desarrollo de iOS.

@protocol ChildViewControllerDelegate
- (NSString *)getSomeNSString;
@end

Entonces deberías hacer ChildViewController tener este delegado como una variable de instancia y ser asignable a través de una propiedad

@property (nonatomic, assign) id<ChildViewControllerDelegate> delegate;

Ahora desde ChildViewController puede usar este delegado para acceder a métodos en el delegado que en su caso será ParentViewController. Esto le permitirá recuperar la cuerda que desee.

[delegate getSomeNSString]

Esto puede parecer mucho trabajo para algo simple, pero evita los problemas heredados con el almacenamiento de una referencia posterior de ChildViewController a su ParentViewController principal.

Respondido 04 Jul 11, 15:07

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