Search code examples
iosobjective-cuinavigationcontroller

Unable to pass value back to parentViewController


I have masterViewController and detailViewController. Masterview pushes detailView. When going back to masteViewController I want to update the foo value. But I only get NULL from nslog. How can I set the parenteViewContrller.foo value to @"bar" when navigationback?

masterViewController.h

    NSString *foo; 
    -(void)setFoo:(NSString *)fooValue
    @property(nonatomic, retain) NSString *foo; 

masterViewController.m

@synthesize foo;

-(void)setFoo:(NSString *)fooValue{

    NSLog(@"updated foo:%@", fooValue);
}

detailViewController.m

-(void)goBack{
    [self.navigationController.parentViewController setValue:@"bar" forKey:@"foo"];
    [self.navigationController popViewControllerAnimated:YES];
}

Solution

  • [UIViewController parentViewController] will not return what you are expecting from iOS 5 onward, instead you should be using [UIViewController presentingViewController]

    If you are just targeting iOS 5, it is easy enough to start using presentingViewController instead, but if not I would advise that you manually pass your UIViewController on:

    // DetailViewController.h
    
    @class MasterViewController;
    
    @interface DetailViewController : UIViewController
    
    @property (assign, nonatomic) MasterViewController *masterViewController;
    
    @end
    
    
    // DetailViewController.m
    
    #import "DetailViewController.h"
    #import "MasterViewController.h"
    
    @implementation DetailViewController
    
    - (void)goBack {
    
        [self.masterViewController setFoo:@"bar"];
    
        // dismiss this view controller
    }
    
    @end
    
    
    // MasterViewController.h
    
    @interface MasterViewController : UIViewController
    
    - (void)setFoo:(NSString *)bar;
    
    @end
    
    
    // MasterViewController.m
    
    #import "MasterViewController.h"
    #import "DetailViewController.h"
    
    @implementation MasterViewController
    
    - (void)goForward {
    
        DetailViewController *detailViewController = ...;
        [detailViewController setMasterViewController:self];
    
        // present this view controller
    }
    
    @end