0

我有一个正在开发的应用程序,它有几个视图控制器,每个视图控制器都显示一个供用户执行的测试。目前,用户可以单独浏览每一个。但是,我正在尝试实现一个类似向导的功能,用户可以选择多个测试或所有测试,然后应用程序将遍历每个测试,将每个屏幕呈现给用户,并且一旦用户提交了输入,应用程序将按顺序移动到下一个测试。完成所有测试后,用户将返回主屏幕。从我读到的内容来看,NSNotifications 将是做到这一点的最佳方式,但老实说,我对此并不陌生,需要帮助。我意识到我应该在启动向导的方法中包含以下行:

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

我也知道,一旦每个viewController运行完毕,就是通过以下方式发布通知:

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

我的问题是,如果用户从表中选择了十个或二十个视图控制器,并且这些选择存储在一个数组中,我是否需要对 addObserver 方法进行尽可能多的调用,以及尽可能多的 postNotifications?我想做的只是简单地遍历每个视图控制器(由用户选择),一旦用户完成向该视图控制器提交输入,该视图控制器应该发送一条消息,用户应该转到下一个视图控制器,完成所有测试后,返回主屏幕。仅供参考,我需要调用每个 ViewController 的 (viewDidLoad) 方法。

如果我的问题令人困惑,我深表歉意。

4

1 回答 1

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
于 2013-01-09T19:30:55.100 回答