NSNotification麻烦

时间:2012-05-10 00:07:44

标签: objective-c nsnotification

当我的课程初始化时,它会将自己添加为一系列不同Wi-Fi通知的观察者。出于某种原因,当发生任何这些事情时,选择器不会运行。有任何想法吗?提前谢谢你。

-(id) init
{
    if (self)
    {
        sself = self;
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleNotification:) name:CWModeDidChangeNotification object:nil];
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleNotification:) name:CWSSIDDidChangeNotification object:nil];
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleNotification:) name:CWBSSIDDidChangeNotification object:nil];
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleNotification:) name:CWCountryCodeDidChangeNotification object:nil];
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleNotification:) name:CWLinkDidChangeNotification object:nil];
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleNotification:) name:CWPowerDidChangeNotification object:nil];

更新: 这是handleNotification方法:

-(void) handleNotification:(NSNotification*) notification
{
    NSLog(@"Notification Received");
}

我已将CoreWLAN框架包含在我的项目中: enter image description here

我已经下载了CoreWLANWirelessManager.app,这就是我用来参考的内容。奇怪的是,Apple的代码使用了已弃用的通知,它仍然有效。我尝试过使用新的API和不推荐使用的API但没有成功。我不确定我是否可以在这里发布他们的代码,但实际上没有区别。选择器甚至具有相同的名称。

请不要犹豫,要求进一步阐述。

更新(在Dustin回答之后):我已经创建了一个新项目,希望能够找到问题。我按照你的描述设置我的.h和.m文件。可悲的是,我还没有得到任何通知。为了告诉你我不是在撒谎(或者说是疯狂),我在同一个运行时中包含了两个(相当拥挤的)截图。注意: (1.我在handleNotification:方法中有一个断点。应用程序永远不会暂停。 (2.我在网络窗口中显示我的Mac 确实在此运行时更改了Wi-Fi网络。 (3.没有什么是NSLoged

网络1: enter image description here

网络2: enter image description here

更新2012年5月17日:Dustin的回答是正确的,但Wi-Fi接口名称因应用程序运行的硬件而异。就我而言,(MacBook Air;没有以太网),我的Wi-Fi是en0而不是en1。我设法从我的妈妈iMac上获取系统配置文件,Wi-Fi称为en1。以太网是en0。谢谢大家的帮助。

1 个答案:

答案 0 :(得分:3)

为了获得这些通知,您需要持有CWInterface的实例。你的.h看起来像这样

#import <Cocoa/Cocoa.h>
@class CWInterface;

@interface AppDelegate : NSObject <NSApplicationDelegate>

@property (assign) IBOutlet NSWindow *window;
@property (retain) CWInterface *wirelessInterface;

@end

然后在.m文件中看起来像这样

#import "AppDelegate.h"
#import <CoreWLAN/CoreWLAN.h>

@implementation AppDelegate

@synthesize window = _window;
@synthesize wirelessInterface;

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
    // Insert code here to initialize your application

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleNotification:) name:CWModeDidChangeNotification object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleNotification:) name:CWSSIDDidChangeNotification object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleNotification:) name:CWBSSIDDidChangeNotification object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleNotification:) name:CWCountryCodeDidChangeNotification object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleNotification:) name:CWLinkDidChangeNotification object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleNotification:) name:CWPowerDidChangeNotification object:nil];

    self.wirelessInterface = [CWInterface interfaceWithName:@"en1"];
}


-(void) handleNotification:(NSNotification*) notification
{
    NSLog(@"Notification Received");
}

@end

注意CWInterface属性,这是重要的位