UIViewController 没有响应 NSNotifications
Posted
技术标签:
【中文标题】UIViewController 没有响应 NSNotifications【英文标题】:UIViewController not responding to NSNotifications 【发布时间】:2013-08-18 20:18:58 【问题描述】:我有一个 UIViewController
没有回复 NSNotifications
。我确定通知启动的操作有效。我的设置可能有什么问题?
我使用单例从AppDelegate
的didFinishLaunching
加载feedViewController
。这个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]];
【问题讨论】:
【参考方案1】:你设置:
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(viewDeckPanned:) name:@"ViewDeckPanned" object:_deckController];
这意味着您正在收听来自 _deckController 的名称为“ViewDeckPanned”的通知(因为 object: 参数应该定义 通知发送者)。 p>
但是,与此同时,您发布了通知:
[[NSNotificationCenter defaultCenter] postNotificationName:@"ViewDeckPanned" object:[NSNumber numberWithFloat:offset]];
你告诉 [NSNumber numberWithFloat:offset] 是一个发送者。由于 _deckController
和 NSNumber
的实例不匹配,因此您不会在观察者中收到通知信息。
简单的更改是将nil
作为object:
参数传递(在这两个地方 - 添加观察者的地方和发布通知的地方),如果你想将 NSNumber 与通知一起传递,那么创建 userInfo 字典包含它。
【讨论】:
以上是关于UIViewController 没有响应 NSNotifications的主要内容,如果未能解决你的问题,请参考以下文章
UIViewController 内的 UITableView 没有响应(Swift 3.0)