LUI
LUI

Reputation: 123

Unable to pass data between MasterVC to DetailVC in iOS

I'm trying to pass data(_claimReportToDetailView) from viewDidLoad (of MasterVC) to DetailVC. It's always null.

@interface LAMasterViewController ()
{
    NSArray *_claimReports;
}

- (void)viewDidLoad
{
    [super viewDidLoad];

    _claimReports = [[LADataModelController getSingleton] getClaimReportsOrderedByAccessedDate];
    LADetailViewController *detailViewController = [[LADetailViewController alloc] init];
    detailViewController.claimReportToDetailView = (LAClaimReport *)_claimReports[0];
    NSLog(@"claim%@",detailViewController.claimReportToDetailView); // captures here properly.
}

@interface LADetailViewController : UIViewController

@property(nonatomic ) LAClaimReport *claimReportToDetailView;

@end

- (void)viewDidLoad
{
    [super viewDidLoad];
    NSLog(@"sdfdf%@", _claimReportToDetailView); // logs null always.
}

Upvotes: 0

Views: 74

Answers (4)

Ashutosh
Ashutosh

Reputation: 2225

This happens because whenever you navigate from one UIViewController to other, it is initialized again, so rather than setting value in viewDidLoad, try to set value on the event when you perform navigation and make navigation through code rather than with segue.

Upvotes: 0

E-Riddie
E-Riddie

Reputation: 14780

This should fix your project. Give it a try

//Allocating LADetailViewController instance
LADetailViewController *detailViewController = [[LADetailViewController alloc]init];

//Connecting it the specified VC on storyboard
detailViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"yourVCID"];

//Now the connection is set, so pass the data you need
detailViewController.claimReportToDetailView = (LAClaimReport *)_claimReports[0];

//Depending on present or push you should try one of the 2 lines
[self.navigationController pushViewController:detailViewController animated:YES];
//or
[self presentViewController:detailViewController animated:YES completion:nil];

Upvotes: 0

Greg
Greg

Reputation: 25459

You have to pass the data to the details view controller in prepareForSeque method in master view controller:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([[segue identifier] isEqualToString:@"showDetail"]) { //<-make shire the segue identifier match one in storyboard
        _claimReports = [[LADataModelController getSingleton] getClaimReportsOrderedByAccessedDate] ;
        LADetailViewController *vc = (LADetailViewController*)[sender destinationViewController];
        vc.claimReportToDetailView = (LAClaimReport *)_claimReports[0];
    }
}

Upvotes: 0

Abizern
Abizern

Reputation: 150565

Your viewDidLoad seems strange. You have this line:

LADetailViewController *detailViewController = [[LADetailViewController alloc]init];

Yet you say that the view controller is on the storyboard.

I think what is happening is that you are creating this VC, and setting it's property, but the Storyboard is loading a completely new VC, for which you haven't set the property.

Usually, the way you pass information to VCs on Storyboards is in the prepareForSegue: method.

Upvotes: 1

Related Questions