1

我正在做一个简单的教程,NSNotification并在正确执行它时遇到一些问题。当我单击第一个视图上的按钮时,第二个视图中的文本字段没有得到更新。当我通过在 中放置 aNSLog进行调试时receiveNotification,没有响应。不知道为什么receiveNotification没有被调用。

代码如下所示:

视图控制器.h

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController{

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

视图控制器.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

需要一些指导。

4

2 回答 2

1

receiveNotification没有被调用,因为你SecondViewController从未实例化过。对象不存在时无法调用。如果您按下secondView, back,然后单击onetwo,则会触发 receiveNotification。

编辑: 我复制并粘贴了你的代码来测试它,我得到了你想要它做的大部分事情。您仍然必须先按secondview,然后再按back

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

在 SecondViewController.h

@interface SecondViewController : UIViewController{
    int counterOne;
    int counterTwo;
}

@property (nonatomic,retain)UITextField *counterOneText;

@property (nonatomic,retain)UITextField *counterTwoText;


-(IBAction)back:(id)sender;

@end

在 SecondViewController.m 中

@interface SecondViewController ()

@结尾

@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];
}
于 2012-11-01T07:58:17.540 回答
0

不是@selector(receiveNotification),应该是@selector(receiveNotification:)

于 2012-11-01T06:23:53.873 回答