这是我第一次尝试使用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"]);
}
答案 0 :(得分:5)
如果尚未注册接收该通知 - 则永远不会收到该通知。通知不会持续存在。如果没有注册的监听器,则发布的通知将丢失。
答案 1 :(得分:3)
特定于您的问题,接收方在发送通知之前尚未开始观察,因此通知会丢失。
更一般地说:你做错了就是在这个用例中使用通知。如果您只是在玩游戏并进行实验,那就没关系了,但是您在此处建模的关系最好通过保留对视图的引用并直接调用其上的方法来实现。如果实验对实际使用它的情况是现实的,通常是最好的。
您应该了解3种基本的沟通机制以及何时使用它们:
通知强> 使用它们通知其他未知对象已发生的事情。当您不知道谁想要回应该事件时使用它们。当多个不同的对象想要响应事件时使用它们。
通常观察者的大部分时间都是注册的。重要的是要确保观察者在被销毁之前将自己从NSNotificationCenter
中移除。
<强>团强> 当一个对象想要从未知来源获取数据或将某个决策的责任传递给未知的'顾问'时,请使用委托。
<强>方法强> 当您知道目标对象是谁,他们需要什么以及何时需要时,请使用直接呼叫。