slaveCoder
slaveCoder

Reputation: 537

IOS Segue not able to set label directly

I am having two view controllers 'FirstViewController' and 'SecondViewController'. From first view controller it will take input from a text field ,process it and display accordingly in the second view. But I am having a problem while setting label value directly.

   @interface SecondViewController : UIViewController
    {
        NSString *numPlate;
        IBOutlet UILabel *output;
    };
    @property(strong,nonatomic) NSString *numPlate;
    @property(strong,nonatomic) IBOutlet UILabel *output;
    @end

The main file for FirstViewController.m with prepare for segue is as

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
 {
    if([[segue identifier] isEqualToString:@"Change"])
    {
       SecondViewController *svc = (SecondViewController *)[segue            destinationViewController]; 
       svc.numPlate = input.text;


       NumberPlate *numPlate=[[NumberPlate alloc]init];
       [numPlate setPlate:input.text];
       NSInteger flag=[numPlate checkValidity];
       if(flag==0)
       {
           svc.output.text  =@"Invalid License";
       }
       else
       if([numPlate getArea]==NULL||[numPlate getRegOffice]==NULL)
       {
            svc.output.text  =@"Data not found";
       }
       else
       {
        svc.output.text  =@"VALID License";
       }
     }
   }

But when the action is performed its not working.The label is not changing. When i used svc.numPlate instead of svc.output.text and in the SecondViewController viewDidLoad method and i used

 - (void)viewDidLoad
{
    [super viewDidLoad];
     output.text=numPlate;
}

Everything is fine with this. Whats wrong in first method??

Upvotes: 0

Views: 244

Answers (3)

Retro
Retro

Reputation: 4005

The initialisation of controller is different and presentation of its view is different process even if the viewController has been initialise its view will not because pushing the controller has not performed and controller dont know he need to load the view.. so we pass the data to controller and it load when view appears... like below code

@interface SecondViewController : UIViewController{
   NSString *strMessage;

}
@property(nonatomic,retain) NSString *strMessage;

@end
SecondViewController.m

@synthesize strMessage;

- (void)viewDidLoad {
Nslog(@"%@",strMessage);
}

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
   if([[segue identifier] isEqualToString:@"Change"])
     {
      SecondViewController *svc = (SecondViewController *)[segue          destinationViewController]; 


    NSString *message = [NSString stringWithFormat:@"Check out %@", nameLb.text];
    svc.strMessage=message;
}

Upvotes: 0

βhargavḯ
βhargavḯ

Reputation: 9836

You will not be able to assign value directly to UILabel of second VC as view is not yet loaded into view hierarchy at this point.

So view cannot render the value assigned prior to it.

On the other hand, holding value in NSString and assigning same on viewDidLoad is working as now your view is in view hierarchy and loaded into memory.

Upvotes: 1

Satish Azad
Satish Azad

Reputation: 2312

At the time when you push SecondViewController, the SecondViewController's view hasn't been loaded yet, so you can't access its views. You need to create NSString properties in SecondViewController and pass a string to SecondViewController' NSString Object. Then in SecondViewController's viewDidLoad method, use those properties to populate the labels (which will have been loaded by the time viewDidLoad runs).

Upvotes: 1

Related Questions