我有一个名为 NSButton 的自定义类MyButton
,我在其中发布快速保存通知
MyButton.m
:
-(void)mouseDown:(id)sender{
[super mouseDown:sender];
[super mouseUp:sender];
[[NSNotificationCenter defaultCenter] postNotificationName:@"quickSave" object:nil userInfo:nil];
}
在AppDelegate
我收到快速保存的通知
AppDelegate.m
::
- (IBAction)saveAction:(id)sender{
NSLog(@"Saving...");
NSError *error = nil;
if (![[self managedObjectContext] commitEditing]) {
NSLog(@"%@:%@ unable to commit editing before saving", [self class], NSStringFromSelector(_cmd));
}
if (![[self managedObjectContext] save:&error]) {
[[NSApplication sharedApplication] presentError:error];
}
}
-(void)awakeFromNib{
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(saveAction:) name:@"quickSave" object:nil];
}
通过NSLog "Saving..."
我看到 saveAction 被调用了 2 次。为什么?
PS:通知调用我在该selector:
字段中插入的每个函数 2 次,所以可能与它有关,-(void)awakeFromNib{...}
因为我看到它被调用了两次(awakeFromNib 中有两个不同的 self)。
更新:我已经“解决”了在 Interface Builder 中将应用程序绑定为 AppDelegate 委托的问题,然后[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(saveAction:) name:@"quickSave" object:nil];
在-(void)applicationDidFinishLaunching:(NSNotification *)aNotification{...}
. 我不知道这是否是一个真正的解决方案,显然它不是我问题的答案(为什么 awakeFromNib 被调用 2 次),但它可能对某人有用。有人有线索吗?
UPDATE2:正确的 managedobjectcontext 是awakeFromNib
第二次调用的,第一个(在awakeFromNib
and中相同applicationDidFinishLaunching
)是错误的。我的应用程序是一个状态栏应用程序,第一个 awakeFromNib 在我启动应用程序时调用,第二个在打开首选项窗口时调用。