我有一个UIViewController
用户单击按钮,然后他们转到另一个UIViewController
进行一些图像处理。一旦图像被操纵,我想要一个NSNotification
。
我的问题是,当用户完成裁剪图像NSNotification
时,我没有收到第一个UIViewController
中的- (void) finishCropping
...我覆盖了我的所有理由和将通知处理方法放在viewDidLoad
,viewWillAppear
,viewWillAppear
...
我不明白为什么我没有收到通知?这应该是非常直接的
如果我从[[NSNotificationCenter defaultCenter] removeObserver:self];
注释viewDidDisappear
它可以工作......但理论上讲......如果我重新设置通知处理程序,则应该再次调用它们可用的方法?
第一个UIViewController& NSNotification Receiver
- (void) addNewPictureFromLibrary {
[self.view endEditing:YES];
imageCroppingViewController* popupController = [self.storyboard instantiateViewControllerWithIdentifier:@"imageCroppingView2"];
[self.navigationController pushViewController:popupController animated:YES];
}
- (void) viewDidDisappear:(BOOL)animated {
[[NSNotificationCenter defaultCenter] removeObserver:self];
}
- (void) viewDidLoad {
[self notifications];
}
- (void) viewWillAppear:(BOOL)animated {
[self notifications];
}
- (void) viewDidAppear:(BOOL)animated {
[self notifications];
}
- (void) notifications {
[[NSNotificationCenter defaultCenter]
addObserver:self
selector:@selector(imageCroppingView:)
name:@"imageCroppingView"
object:nil];
}
- (void) imageCroppingView:(NSNotification *) notification {
NSLog(@"imageCroppingView IN HERE");
}
发件人UIViewController
- (void) finishCropping {
float zoomScale = 1.0 / [scrollView zoomScale];
CGRect visibleRect;
visibleRect.origin.x = scrollView.contentOffset.x * zoomScale;
visibleRect.origin.y = scrollView.contentOffset.y * zoomScale;
visibleRect.size.width = scrollView.bounds.size.width * zoomScale;
visibleRect.size.height = scrollView.bounds.size.height * zoomScale;
UIImage *cropped = imageFromView(imageView.image, &visibleRect);
NSDictionary *dictionary = @{@"image":cropped};
self.navigationController.navigationBar.hidden = NO;
[self.navigationController popToRootViewControllerAnimated:TRUE];
[[NSNotificationCenter defaultCenter]
postNotificationName:@"imageCroppingView"
object:nil
userInfo:dictionary];
}
答案 0 :(得分:0)
这是因为您要从viewDidDisappear中的self
移除NSNotificationCenter
。
加载另一个视图时会自动调用viewDidDisappear
到您现有的视图控制器,因此它会因为您的第一个UIViewController中的代码而取消注册所有通知 -
- (void) viewDidDisappear:(BOOL)animated {
[[NSNotificationCenter defaultCenter] removeObserver:self];
}
viewDidDisappear
是在加载imageCroppingViewController之前调用的最后一个方法,此后你永远不会注册。
如果您想有选择地取消注册某些通知,请使用removeObserver
的名称方法拨打NSNotificationCenter
[[NSNotificationCenter defaultCenter] removeObserver:self name:@"NotificationNameYouDontWantToListenAnyLonger" object:nil];
请注意,多次通知addObserver
并不意味着您多次注册。对象在通知中心只有一个条目每个通知(每个通知名称松散地说出唯一对象)。
我希望这能澄清并带你走向解决方案。如果有任何问题,请告诉我。