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..
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];
}