简体   繁体   中英

Passing data between views isn't working

I've done this many times with code that is exactly the same, but for some reason it isn't working today.

 ExampleViewController1 *exampleView = [[ExampleViewController1 alloc] initWithNibName:@"ExampleViewController1" bundle:nil];
 [exampleView setProjectName:[[self.projectListArray objectAtIndex:indexPath.row] objectForKey:@"name"]];
 NSLog(@"%@", [[self.projectListArray objectAtIndex:indexPath.row] objectForKey:@"name"]);
 XAppDelegate.stackController pushViewController:exampleView fromViewController:nil animated:YES]

My NSLog prints out appropriately.

My ExampleViewController1.h file declared like:

@property(nonatomic, strong) NSString *projectName; 

I then do this code in ExampleViewController1.m 's

 -(void)viewDidLoad {
     NSLog(@"%@", self.projectName);
     self.projectNameLabel.text = self.projectName;
     [super viewDidLoad];
 }

The results of my NSLog s are curious. The NSLog from my viewDidLoad appears to be getting called before my other one:

 2012-04-22 10:59:41.462 StackedViewKit[43799:f803] (null)
 2012-04-22 10:59:41.463 StackedViewKit[43799:f803] NewTest

I have confirmed that the (null) value there is from NSLog(@"%@", self.projectName); , but that should be the second NSLog called...I can't figure out why it is coming through first.

Someone requested this code:

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
   if ((self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil])) {

    // random color
    self.view.backgroundColor = [UIColor colorWithRed:((float)rand())/RAND_MAX green:((float)rand())/RAND_MAX blue:((float)rand())/RAND_MAX alpha:1.0];
   }
  return self;
}

viewDidLoad is called before a view controller is displayed for the first time, not immediately after initWithNibName.

> viewDidLoad method is called after the view controller has loaded its view hierarchy into memory. This method is called regardless of whether the view hierarchy was loaded from a nib file or created programmatically in the loadView method.

> initWithNibName The nib file you specify is not loaded right away. It is loaded the first time the view controller's view is accessed. If you want to perform additional initialization after the nib file is loaded, override the viewDidLoad method and perform your tasks there.

You can use App delegate to pass the data from one to another, that is another alternate solution.

you do in initWithNibName method itself. or in viewDidAppear.

Your initWithNibName method should be like this as per as @sch comments;

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { 

     self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil] //just set it here first and then check

     if (self) { 
         // do something here; 
         } 
return self; 
}

We just need to be smart enough to think about what do we need to in constructor and what do we need to at viewDidLoad (once it had loaded into memory)

As I expected, the problem is that you are trying to access self.view inside the initialization method. So move the line self.view.backgroundColor = ... to the viewDidLoad method:

- (void)viewDidLoad
{
    [super viewDidLoad];
    NSLog(@"%@", self.projectName);
    self.projectNameLabel.text = self.projectName;
    self.view.backgroundColor = [UIColor colorWithRed:((float)rand())/RAND_MAX green:((float)rand())/RAND_MAX blue:((float)rand())/RAND_MAX alpha:1.0];
}

In fact, the documentation of the view property says:

If you access this property and its value is currently nil, the view controller automatically calls the loadView method and returns the resulting view.

So when you call self.view in the initialization method, the view controller will have to load the view (from the nib or using the loadView method). And that's why viewDidLoad is called.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM