0

我有一个UIViewController用户点击一个按钮然后他们去另一个UIViewController做一些图像处理的地方。一旦图像被操纵,我想要一个NSNotification.

我突出的问题是,当用户完成裁剪图像时,我没有收到NSNotification第一个消息...我涵盖了所有理由并将通知处理方法放入, , ...UIViewController- (void) finishCroppingviewDidLoadviewWillAppearviewWillAppear

我不明白为什么我没有收到通知?这应该很简单

如果我注释掉它的工作原理......[[NSNotificationCenter defaultCenter] removeObserver:self];但从viewDidDisappear理论上讲......如果我重新设置通知处理程序,它们应该在 3 种可用方法中的任何一种中再次调用?

第一个 UIViewController 和 NSNotification 接收器

- (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];

}
4

1 回答 1

0

这是因为您正在selfNSNotificationCenterviewDidDisappear 中删除。当另一个视图加载时viewDidDisappear会自动调用到您现有的视图控制器,因此由于您的第一个 UIViewController 中的此代码,它会为所有通知自行取消注册 -

- (void) viewDidDisappear:(BOOL)animated    {
    [[NSNotificationCenter defaultCenter] removeObserver:self];
}

viewDidDisappear是加载 imageCroppingViewController 之前调用的最后一个方法,此后您永远不会注册。

如果您想有选择地取消注册某些通知,请removeObserver使用 name 方法调用NSNotificationCenter

[[NSNotificationCenter defaultCenter] removeObserver:self name:@"NotificationNameYouDontWantToListenAnyLonger" object:nil];

请注意addObserver,多次要求通知并不意味着您已多次注册。每个通知对象在通知中心只有一个条目(松散地说每个通知名称的唯一对象)。

我希望这可以澄清并带您解决问题。如果有任何问题,请告诉我。

于 2013-10-29T22:10:17.643 回答