Search code examples
iphoneiosnsnotificationcenternsnotification

Text Field not being updated in NSNotification


I am doing a simple tutorial on NSNotification and facing some problems in executing it properly. When I click the button on the First View, the text field in the second view does not get update. When i debug by placing a NSLog in the receiveNotification, no response. Not sure why the receiveNotification is not being called.

The code looks like this:

ViewController.h

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController{

}
-(IBAction)one:(id)sender;
-(IBAction)two:(id)sender;
-(IBAction)secondview:(id)sender;
@end

ViewController.m

#import "ViewController.h"
#import "SecondViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}
-(IBAction)one:(id)sender{
    [[NSNotificationCenter defaultCenter] postNotificationName:@"Test1" object:self];
    NSLog(@"Hello");
}
-(IBAction)two:(id)sender{
    [[NSNotificationCenter defaultCenter] postNotificationName:@"Test2" object:self];
     NSLog(@"Hello");
}
-(IBAction)secondview:(id)sender{
    SecondViewController *secondview = [[SecondViewController alloc] initWithNibName:@"SecondViewController" bundle:nil];
    [self presentViewController:secondview animated:YES completion:nil];
}

@end

SecondViewController.h

#import <UIKit/UIKit.h>

@interface SecondViewController : UIViewController{
    IBOutlet UITextField *counterOneText;
    IBOutlet UITextField *counterTwoText;
    int counterOne;
    int counterTwo;
}

-(IBAction)back:(id)sender;
@end

SecondViewController.m

#import "SecondViewController.h"

@interface SecondViewController ()

@end

@implementation SecondViewController

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

        counterOne = 0;
        counterTwo = 0;

        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(receiveNotification) name:@"Test1" object:nil];
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(receiveNotification) name:@"Test2" object:nil];
    }
    return self;
}

-(void)receiveNotification:(NSNotification *)notification{
    if([[notification name] isEqualToString:@"Test1"])  {
        counterOne++;
        counterOneText.text = [NSString stringWithFormat:@"%d",counterOne];
        NSLog(@"%@",counterOneText.text);
        NSLog(@"Hello");
    }else
    {
        counterTwo++;
        counterTwoText.text = [NSString stringWithFormat:@"%d",counterTwo];
    }
}

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view from its nib.
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}
-(IBAction)back:(id)sender{
    [self dismissViewControllerAnimated:YES completion:nil];
}

@end

Need some guidance on this..


Solution

  • receiveNotification is not getting called because your SecondViewController was never instantiated. It cannot possible be called when the object doesn't exist. If you pressed secondView, back, then click one or two, then the receiveNotification will trigger.

    EDIT: I copied and pasted your code to test it out and I got most of what you want it to do. You will still have to press secondview first, then back.

    In ViewController.m

    @interface ViewController (){
        SecondViewController *secondview;
    }
    
    @end
    
    @implementation ViewController
    
    -(id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil{
        self = [super initWithNibName: nibNameOrNil bundle:nibBundleOrNil];
        if(self){
            secondview = [[SecondViewController alloc] initWithNibName:@"SecondViewController" bundle:nil];
        }
        return self;
    }
    
    - (void)viewDidLoad
    {
        [super viewDidLoad];
    
        // Do any additional setup after loading the view, typically from a nib.
    }
    
    - (void)didReceiveMemoryWarning
    {
        [super didReceiveMemoryWarning];
        // Dispose of any resources that can be recreated.
    }
    -(IBAction)one:(id)sender{
        [[NSNotificationCenter defaultCenter] postNotificationName:@"Test1" object:self];
    }
    -(IBAction)two:(id)sender{
        [[NSNotificationCenter defaultCenter] postNotificationName:@"Test2" object:self];
    }
    -(IBAction)secondview:(id)sender{
        [self presentViewController:secondview animated:YES completion:nil];
    }
    

    In SecondViewController.h

    @interface SecondViewController : UIViewController{
        int counterOne;
        int counterTwo;
    }
    
    @property (nonatomic,retain)UITextField *counterOneText;
    
    @property (nonatomic,retain)UITextField *counterTwoText;
    
    
    -(IBAction)back:(id)sender;
    
    @end
    

    In SecondViewController.m

    @interface SecondViewController ()

    @end

    @implementation SecondViewController
    @synthesize counterOneText, counterTwoText;
    
    - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
    {
        self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
        if (self) {
    
            counterOne = 0;
            counterTwo = 0;
    
            self.counterOneText = [[UITextField alloc]initWithFrame:CGRectMake(100, 50, 150, 30)];
            self.counterOneText.borderStyle = UITextBorderStyleRoundedRect;
            self.counterOneText.text = [NSString stringWithFormat:@"%@", [NSNumber numberWithInt:counterOne]];
    
            self.counterTwoText = [[UITextField alloc]initWithFrame:CGRectMake(100, 100, 150, 30)];
            self.counterTwoText.borderStyle = UITextBorderStyleRoundedRect;
            self.counterTwoText.text = [NSString stringWithFormat:@"%@", [NSNumber numberWithInt:counterTwo]];
    
            //self.counterOneText.text = [NSString stringWithFormat:@"%d",counterOne];
            //self.counterTwoText.text = [NSString stringWithFormat:@"%d",counterTwo];
    
    
            [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(receiveNotification:) name:@"Test1" object:nil];
            [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(receiveNotification:) name:@"Test2" object:nil];
        }
        return self;
    }
    
    -(void)receiveNotification:(NSNotification *)notification{
        if([[notification name] isEqualToString:@"Test1"])  {
            counterOne++;
            NSLog(@"counterOne: %d", counterOne);
            counterOneText.text = [NSString stringWithFormat:@"%@", [NSNumber numberWithInt:counterOne]];
    
            NSLog(@"counterOneText.text: %@",counterOneText.text);
            NSLog(@"Test1");
        }else
        {
            counterTwo++;
            NSLog(@"counterTwo: %d", counterTwo);
            counterTwoText.text = [NSString stringWithFormat:@"%@",[NSNumber numberWithInt:counterTwo]];
    
            NSLog(@"counterTwoText.text: %@",counterTwoText.text);
            NSLog(@"Test2");
    
    
        }
    
    }
    
    - (void)viewDidLoad
    {
        [self.view addSubview:self.counterOneText];
        [self.view addSubview:self.counterTwoText];
        [super viewDidLoad];
        // Do any additional setup after loading the view from its nib.
    }
    
    - (void)didReceiveMemoryWarning
    {
        [super didReceiveMemoryWarning];
        // Dispose of any resources that can be recreated.
    }
    -(IBAction)back:(id)sender{
        [self dismissViewControllerAnimated:YES completion:nil];
    }