使用popToRootViewControllerAnimated时收到NSNotification的问题

时间:2013-10-29 21:01:40

标签: objective-c cocoa-touch nsnotification

我有一个UIViewController用户单击按钮,然后他们转到另一个UIViewController进行一些图像处理。一旦图像被操纵,我想要一个NSNotification

我的问题是,当用户完成裁剪图像NSNotification时,我没有收到第一个UIViewController中的- (void) finishCropping ...我覆盖了我的所有理由和将通知处理方法放在viewDidLoadviewWillAppearviewWillAppear ...

我不明白为什么我没有收到通知?这应该是非常直接的

如果我从[[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];

}

1 个答案:

答案 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并不意味着您多次注册。对象在通知中心只有一个条目每个通知(每个通知名称松散地说出唯一对象)。

我希望这能澄清并带你走向解决方案。如果有任何问题,请告诉我。