0

应用委托:

- (void)applicationDidBecomeActive:(UIApplication *)application {
    [[NSNotificationCenter defaultCenter] postNotificationName:APP_REFRESH_NOTIFICATION object:nil];
}

在我的视图控制器中:

- (void)viewDidLoad {
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(doStuff) postNotificationName:APP_REFRESH_NOTIFICATION object:self];
}

- (void)doStuff永远不会被调用。为什么?

4

3 回答 3

1

我假设您输入的问题不正确,并且您打算写addObserver:selector:name:object:, 而不是addObserver:selector: postNotificationName:object:(这种方法不存在)。

- (void)addObserver:(id)notificationObserver selector:(SEL)notificationSelector name:(NSString *)notificationName object:(id)notificationSender 我们可以阅读的文档中:

通知发送者

观察者想要接收其通知的对象;也就是说,只有这个发送者发送的通知才会传递给观察者。如果你传递 nil,通知中心不会使用通知的发送者来决定是否将它传递给观察者。

因此,在您的情况下,当您传入object:nilpostNotificationName:object:,您还必须设置object:nilin addObserver:selector:name:object:

根据文档,您还应该将该方法替换为doStuff

- (void)doStuff:(NSNotification *)notification

@selector(doStuff:)addObserver:selector:name:object:.

于 2013-10-15T21:14:02.753 回答
1

您将self作为object参数传递给addObserver:selector:name:object:,但doStuff不接受任何参数,因此方法调用失败(静默)。你viewDidLoad应该是这样的:

- (void)viewDidLoad {
    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(doStuff)
                                                 name:APP_REFRESH_NOTIFICATION
                                               object:nil];
}
于 2013-10-15T21:18:39.413 回答
0

当应用程序变为活动状态时,您的应用程序委托会发布通知,但您的视图控制器在其视图加载之前不会订阅该通知。如果您的应用程序委托正在创建您的视图控制器并加载它(这很可能),那么在发布通知时您的控制器甚至不存在,这就是它没有收到它的原因。如果您使用故事板,并且该控制器是故事板中的入口点,并且您使用应用程序的 info.plist 将该故事板设置为主界面,那么它将已经实例化控制器并通过时间到了-applicationDidBecomeActive:,解决你的问题。

于 2013-10-15T21:13:10.767 回答