选择器没有收到来自 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 的viewDidLoad
prepareArrays
?【参考方案2】:
您的代码逻辑不正确。您正在发布通知并已将两个班级作为观察者,因此这将导致不可预知的结果。您应该有一个班级作为通知的观察者。
【讨论】:
【参考方案3】:据我所知,这里应该只调用一个通知侦听器,这应该是您的 SecondVC,因为您的第一个视图控制器尚未加载,因此没有为第一个视图控制器注册观察者。
【讨论】:
相反,第一个VC有效,第二个VC无效 @FS.O 不确定它为什么会起作用,因为根据代码,您的第二个控制器通知观察者在发布通知之前已附加,但您的 firstVC 不应为通知附加观察者,因为已加载初始视图控制器在 AppDelegate 之后。所以只有 secondVC 会收到您的通知。以上是关于选择器没有收到来自 NSNotificationCenter (iOS) 的通知的主要内容,如果未能解决你的问题,请参考以下文章