0

我有一个UIViewController没有响应的NSNotifications。我确定通知启动的操作有效。我的设置可能有什么问题?

我使用单例feedViewControllerAppDelegate's加载 a didFinishLaunching。这feedViewController保留了对 a 的引用deckViewController,并且deckViewController可靠地发送了feedViewController应该观察的通知。然而,从未收到通知。我确保singleton保持对应该接收通知的视图控制器的强烈引用。

singleton其中包含对通知观察者的引用:

 // .h file
 @property (nonatomic) ROFeedViewController *feedViewController;

 // .m file
 _feedViewController = [[ROFeedViewController alloc] init];
    IIViewDeckController *deckController = [[IIViewDeckController alloc] initWithCenterViewController:_feedViewController leftViewController:leftController rightViewController:rightController];
    _feedViewController.deckController = deckController;

在通知观察者 ( ROFeedViewControler) 中:

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(viewDeckPanned:) name:@"ViewDeckPanned" object:_deckController];
    ...
}

- (void)viewDeckPanned:(NSNotification *)notification {
    float offset = [(NSNumber *)[notification object] floatValue];
    if (offset > 0) {
        _leftButton.transform = CGAffineTransformMakeRotation(offset * M_PI / 180.0);
    } else {
        _rightButton.transform = CGAffineTransformMakeRotation(offset * M_PI / 180.0);
    }
}

可靠通知从通知发送者 ( IIViewDeckController) 发送:

- (void)notifyDidChangeOffset:(CGFloat)offset orientation:(IIViewDeckOffsetOrientation)orientation panning:(BOOL)panning {
    [self performDelegate:@selector(viewDeckController:didChangeOffset:orientation:panning:) offset:offset orientation:orientation panning:panning];
    [[NSNotificationCenter defaultCenter] postNotificationName:@"ViewDeckPanned" object:[NSNumber numberWithFloat:offset]];

}

4

1 回答 1

2

你设置:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(viewDeckPanned:) name:@"ViewDeckPanned" object:_deckController];

这意味着您正在收听来自_deckController 的名称为“ViewDeckPanned”的通知(因为 object: 参数应该定义通知发送者)。

但是,同时,您发布通知:

[[NSNotificationCenter defaultCenter] postNotificationName:@"ViewDeckPanned" object:[NSNumber numberWithFloat:offset]];

你告诉 [NSNumber numberWithFloat:offset] 是一个发件人。由于_deckController和实例NSNumber不匹配,因此您不会在观察者中获得通知信息。

nil简单的更改是作为参数传递object:(在两个地方 - 添加观察者的地方和发布通知的地方),如果你想将 NSNumber 与通知一起传递,那么创建包含它的 userInfo 字典。

于 2013-08-18T20:26:18.507 回答