0

这是我第一次尝试NSNotification,尝试了几个教程,但不知何故它不起作用。

基本上我正在向 B 类发送一个字典,它是弹出子视图(UIViewController)并测试是否已收到。

谁能告诉我我做错了什么?

A级

- (IBAction)selectRoutine:(id)sender {
    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Storyboard" bundle:nil];

    NSDictionary *dictionary = [NSDictionary dictionaryWithObject:@"Right"
                                                           forKey:@"Orientation"];
    [[NSNotificationCenter defaultCenter]
     postNotificationName:@"PassData"
     object:nil
     userInfo:dictionary];

    createExercisePopupViewController* popupController = [storyboard instantiateViewControllerWithIdentifier:@"createExercisePopupView"];

    //Tell the operating system the CreateRoutine view controller
    //is becoming a child:
    [self addChildViewController:popupController];

    //add the target frame to self's view:
    [self.view addSubview:popupController.view];

    //Tell the operating system the view controller has moved:
    [popupController didMoveToParentViewController:self];

}

B类

- (void)viewDidLoad
{
    [super viewDidLoad];

    [[NSNotificationCenter defaultCenter]
     addObserver:self
     selector:@selector(receiveData:)
     name:@"PassData"
     object:nil];
}

- (void)receiveData:(NSNotification *)notification {
    NSLog(@"Data received: %@", [[notification userInfo] valueForKey:@"Orientation"]);
}
4

2 回答 2

5

如果它还没有注册接收该通知 - 它永远不会收到它。通知不会持续存在。如果没有注册的监听器,发布的通知将会丢失。

于 2013-04-30T19:40:32.597 回答
3

针对您的问题,接收方在发送通知之前尚未开始观察,因此通知会丢失。

更一般地说:您做错的是使用此用例的通知。如果您只是在玩耍和试验,那很好,但是您在这里建模的那种关系最好通过保留对视图的引用并直接调用它的方法来执行。如果实验对实际使用的情况是现实的,通常是最好的。

您应该了解 3 种基本通信机制以及何时使用它们:

通知 使用它们通知其他未知对象发生了什么事。当您不知道谁想要响应事件时使用它们。当多个不同的对象想要响应事件时使用它们。

通常观察者在其一生中的大部分时间都在注册。NSNotificationCenter确保观察者在被销毁之前将其自身移除是很重要的。

委派 当一个对象想要从未知来源获取数据或将某些决定的责任转交给未知的“顾问”时,使用委派。

方法 当您知道目标对象是谁、他们需要什么以及何时需要时,使用直接调用。

于 2013-04-30T19:52:45.627 回答