NSNotificationCenter在ViewControllers之间不起作用

时间:2014-05-10 04:10:49

标签: ios objective-c nsnotificationcenter

我已经在这个艰难的(但对你来说很简单)问题上撞墙了两天。

问题如下:

  1. 我在appdelegate发布通知
  2. 我试图在viewcontroller中收到该通知,但我收不到它。
  3. 以下是此代码。

    在appdelegate.h中

    #import <UIKit/UIKit.h>
    
    @interface AppDelegate : UIResponder <UIApplicationDelegate>
    
    @property (strong, nonatomic) UIWindow *window;
    @property (strong, nonatomic) NSString * someString;
    @end
    

    在appdelegate.m

    #import "AppDelegate.h"
    #import "SomeContextExample.h"
    
    
    @implementation AppDelegate
    
    
    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
    {
    // Override point for customization after application launch.
    
        self.someString = @"Hello!";
    
    
        NSDictionary * userInfo = @{SomeContextExampleRef : self.someString};
        [[NSNotificationCenter defaultCenter] postNotificationName:@"SomeContextExample"
                                                            object:nil
                                                          userInfo:userInfo];
    
    return YES;
    }
    

    &#34; SomeContextExampleRef&#34;来自.h文件如下:

    #ifndef SampleNotWorking_SomeContextExample_h
    #define SampleNotWorking_SomeContextExample_h
    
    #define SomeContextExampleRef @"SomeContextExampleRef"
    
    #endif
    

    最后,在viewController.m中:

    #import "ViewController.h"
    #import "SomeContextExample.h"
    
    @interface ViewController ()
    
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad
    {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    
    NSOperationQueue *mainQueue = [NSOperationQueue mainQueue];
    [[NSNotificationCenter defaultCenter] addObserverForName:@"SomeContextExample"
                                                      object:nil
                                                       queue:mainQueue
                                                  usingBlock:^(NSNotification *note)
     {
    
         NSLog(@"got the notification!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! %@", note.userInfo);
    
    
    
     }];
    }
    

    我的完整代码附在此处: https://github.com/moomoo23/SampleNotWorking

    感谢您帮助初学者!

2 个答案:

答案 0 :(得分:3)

如果您确信“ViewController”对象已实例化和/或进入视图,请尝试发布通知。例如。为什么不把它放到一些UIButton触发的“IBAction”方法中试试呢?

观察视图控制器可能会或可能不会(在您的情况下更不可能)存在于您的应用代表中“application:didFinishLaunchingWithOptions:”的末尾。

答案 1 :(得分:0)

另一种方法是使用scheduledTimerWithTimeInterval:target:selector:userInfo:repeats:方法在延迟后发布通知。

现在,从概念上讲,为什么你会在appFinsihedLaunching时发布通知?....只是好奇...... e