我有一个UIViewController
没有响应NSNotifications
。我确定通知启动的操作有效。我的设置有什么问题?
我使用单例从feedViewController
的AppDelegate
加载didFinishLaunching
。此feedViewController
保留对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]];
}
最佳答案
您设置:
[[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字典。关于ios - UIViewController不响应NSNotifications,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18303254/