尝试一次一个地调用多个视图控制器到iOS中的NSNotification

时间:2013-01-09 18:17:05

标签: ios nsnotificationcenter nsnotification

我有一个我正在处理的应用程序,它有几个viewControllers,每个都显示一个用户要执行的测试。目前,用户可以单独检查每一个。但是,我正在尝试实现类似向导的功能,用户可以选择多个测试或所有测试,然后应用程序将遍历每个测试,向用户显示每个屏幕,一旦用户提交了输入,应用程序将按顺序移至下一个测试。完成所有测试后,用户将返回主屏幕。从我所看到的,NSNotifications将是最好的方法,但我老实说,我是新手,需要帮助。我意识到我应该在启动向导的方法中使用该行:

[[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(testChange:)
                                                 name:@"Test"
                                               object:nil];

我也知道每次viewController运行完毕后,就会以下列方式发布通知:

[[NSNotificationCenter defaultCenter] postNotificationName:@"Test" object:self];

我的问题是,如果用户从一个表中选择了十个或二十个viewControllers,并且这些选择存储在一个数组中,我是否需要调用addObserver方法和多个postNotifications?我想要做的只是遍历每个viewController(由用户选择),一旦用户完成对该viewController的提交输入,该viewController应该发送消息,用户应继续前进到下一个viewController,完成所有测试后,返回主屏幕。就像一个FYI,我需要调用每个ViewController的(viewDidLoad)方法。

如果我的问题令人困惑,我道歉。

1 个答案:

答案 0 :(得分:0)

您是对的,如果您希望所有视图控制器都接收通知,则需要为所有视图控制器调用addObserver。我创建了一个小代码片段来向您展示它是如何完成的。我想你有你要求的所有答案。试试吧。

#import "ViewController.h"

@interface Employee:NSObject
@end

@implementation Employee
-(void)testMethod2:(NSNotification *)not{
    NSLog(@"Test method2 is called");
}
@end

@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)postNotifications:(id)sender {
    Employee *employee = [[Employee alloc] init];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(testMethod:) name:@"Notification" object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(testMethod1:) name:@"Notification" object:nil];
     [[NSNotificationCenter defaultCenter] addObserver:employee selector:@selector(testMethod2:) name:@"Notification" object:nil];
    [[NSNotificationCenter defaultCenter] postNotificationName:@"Notification" object:nil];
}

-(void)testMethod:(NSNotification *)not{
    NSLog(@"Test method is called");
}
-(void)testMethod1:(NSNotification *)not{
    NSLog(@"Test method1 is called");
}
@end