选择器没有收到来自 NSNotificationCenter (iOS) 的通知

Posted

技术标签:

【中文标题】选择器没有收到来自 NSNotificationCenter (iOS) 的通知【英文标题】:Selector don't getting notification from NSNotificationCenter (iOS) 【发布时间】:2016-01-27 11:56:11 【问题描述】:

我正在使用 NSNotificationCenter 从继承自 NSObject 的类发送通知。

通知应该发送到 2 个 viewController 但它只发送到其中一个。

我的代码:

fetchFromParse

-(void)sendAllStores

    [[NSNotificationCenter defaultCenter]postNotificationName:@"getStoresArrays" object:nil userInfo:self.storesDict];

firstVC.m(工作中):

- (void)viewDidLoad 
    [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(getStoresArrays:) name:@"getStoresArrays" object:nil];


-(void)getStoresArrays:(NSNotification*)notification

    NSLog(@“Working”); //Working   

secondVC.m(不工作):

-(void)prepareArrays

    [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(getStoresArrays:) name:@"getStoresArrays" object:nil];

-(void)getStoresArrays:(NSNotification*)notification

    NSLog(@“Not Working”); //Not working

AppDelegate.m

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
    secondVC *secVC=[[secondVC alloc] init];
    [secVC prepareArrays];

    fetchFromParse *fetchFromParseObj=[[fetchFromParse alloc] init];
    [fetchFromParseObj getStoresFromParse];

    Return YES;

注意:Xcode 向我显示“firstVC 未注册为观察者”的错误消息。

【问题讨论】:

是否调用了firstVC的viewDidLoad? @User31 是的,通知也正在发送到 firstVC,问题是 secondVC。 你会从 firstVC 中删除观察者吗? @User31 不,我没有。 你应该从两个控制器中删除观察者 【参考方案1】:

firstVC 从未使用过,因此它无法添加观察者。

它在 viewDidLoad 中添加观察者,但如果视图控制器从未使用过,它无法加载视图,因此不会添加观察者。

【讨论】:

它适用于第一个 VC,我不适用于第二个 VC。顺便说一句,firstVC 正在使用情节提要。 我不认为你实现它的方式是这样的。另一种解决方案是不使用 NSNotification (有可能,但我还没有看到原因。)并创建一个基类,firstVC 和 secondVC 继承自该基类,并在该基类中创建一个将获取数据的方法from Parse 并在 firstVC / secondVC 的 viewWillAppear / viewDidLoad 中访问该方法。 我更喜欢使用 NSNotificationCenter,但是为什么它不起作用?? 老实说,我不知道为什么它不起作用,因此我反对在这种情况下使用它。如果您打算使用 NSNotificationCenter,那么我会将它放在两个控制器的超类中。从我在您的代码中看到的内容中了解这一点很重要。如果您从 firstVC 过渡到 secondVC,您也不会收到通知,因为 1. 在加载 secondVC 时不会调用 prepareArrays 并且 2. 在 AppDelegate 中您刚刚初始化了 secondVC 并调用了该方法。如果 didFinish 方法完成,您将不再持有对 secondVC 的引用。也许是这样? 所以你建议拨打 secondVC 的viewDidLoadprepareArrays?【参考方案2】:

您的代码逻辑不正确。您正在发布通知并已将两个班级作为观察者,因此这将导致不可预知的结果。您应该有一个班级作为通知的观察者。

【讨论】:

【参考方案3】:

据我所知,这里应该只调用一个通知侦听器,这应该是您的 SecondVC,因为您的第一个视图控制器尚未加载,因此没有为第一个视图控制器注册观察者。

【讨论】:

相反,第一个VC有效,第二个VC无效 @FS.O 不确定它为什么会起作用,因为根据代码,您的第二个控制器通知观察者在发布通知之前已附加,但您的 firstVC 不应为通知附加观察者,因为已加载初始视图控制器在 AppDelegate 之后。所以只有 secondVC 会收到您的通知。

以上是关于选择器没有收到来自 NSNotificationCenter (iOS) 的通知的主要内容,如果未能解决你的问题,请参考以下文章

Laravel Echo 没有收到更多事件

无法识别的选择器发送到来自 Facebook SDK 的类

来自画廊工作的文件选择器,但它不适用于 android webview 中的相机

Selenium 超时接收来自渲染器的消息

选择器 valueWithCGRect 没有已知的类方法

来自动态创建的按钮的 Swift 3 IOS 访问类方法