Cocoa从子类中的子类发布NSNotification

时间:2015-03-06 11:13:14

标签: objective-c cocoa nsnotificationcenter nsnotifications

我遇到了从NSButton发送的NSNotification的问题,该NSButton已被子类化以检测双击。它本身在NSView的子类中使用。

当我将通知发布到默认通知中心时,它永远不会到达我正在收听它的appDelegate。

这是我的NSButton子类:

#import "DoubleClickButton.h"
#import "AppDelegate.h"

@implementation DoubleClickButton


- (void)mouseDown:(NSEvent *)theEvent
{
    NSInteger clickCount = [theEvent clickCount];
    if (2 == clickCount)
    {
        [self performSelectorOnMainThread:@selector(handleDoubleClickEvent:)     withObject:nil waitUntilDone:NO];
    }
}  

-(void)handleDoubleClickEvent:(NSEvent *)event
{
    NSLog(@"DoubleClick");

    [[NSNotificationCenter defaultCenter] postNotificationName:@"doubleClickButtonNotification" object:nil];
}

@end

听我的AppDelegate applicationDidFinishLaunching方法:

//Notification for Double tap notification
[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(doubleTapAction:)
                                             name:@"doubleClickButtonNotification"
                                           object:self];

通知永远不会到来,而doubleTapAction:永远不会被调用。

请有人指出我正确的方向,因为它正在融化我的大脑......

非常感谢提前

1 个答案:

答案 0 :(得分:2)

首先:用户事件(作为鼠标按下)始终在主线程上传递。因此,您不需要-performSelectorOnMainThread:…

你的问:很可能你误解了对象参数。为什么在发布通知时将其设置为nil并将其设置为self以添加观察者?由于nil不是$ anySelf,因此不匹配。当您添加 观察者以获取所有发件人的通知时,可以将此参数设置为nil。所以简单地反过来做。 (在发布通知时将对象设置为有用的内容,并在添加观察者时将对象设置为nil。)