Cocoa 从子类中的子类发布 NSNotification
Cocoa Posting an NSNotification from a subclass within a subclass
我在接收从 NSButton 发送的 NSNotification 时遇到问题,该 NSButton 已被子类化以检测双击。它本身在 NSView 的子类中使用。
当我 post 向默认通知中心发送通知时,它永远不会到达我正在监听的 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: 永远不会被调用。
请有人指出我正确的方向,因为它正在融化我的大脑...
非常感谢
本
首先:用户事件(如鼠标按下)总是在主线程上传递。因此你不需要 -performSelectorOnMainThread:…
.
给你的问题:你可能误解了对象参数。为什么发通知的时候设置成nil
,添加观察者的时候设置成self
?由于 nil
不是不匹配的 $anySelf。您可以在 添加 observer 时将此参数设置为 nil
以获取所有发件人的通知。所以简单地反过来做。 (在发布通知时将对象设置为有用的东西,在添加观察者时设置为 nil
。)
我在接收从 NSButton 发送的 NSNotification 时遇到问题,该 NSButton 已被子类化以检测双击。它本身在 NSView 的子类中使用。
当我 post 向默认通知中心发送通知时,它永远不会到达我正在监听的 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: 永远不会被调用。
请有人指出我正确的方向,因为它正在融化我的大脑...
非常感谢
本
首先:用户事件(如鼠标按下)总是在主线程上传递。因此你不需要 -performSelectorOnMainThread:…
.
给你的问题:你可能误解了对象参数。为什么发通知的时候设置成nil
,添加观察者的时候设置成self
?由于 nil
不是不匹配的 $anySelf。您可以在 添加 observer 时将此参数设置为 nil
以获取所有发件人的通知。所以简单地反过来做。 (在发布通知时将对象设置为有用的东西,在添加观察者时设置为 nil
。)