Reputation: 29084
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..
Upvotes: 1
Views: 868
Reputation: 651
Not @selector(receiveNotification)
, should be @selector(receiveNotification:)
Upvotes: 0
Reputation: 1847
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];
}
Upvotes: 1