Cocoa:saveAction通知被召唤2次

时间:2013-06-25 18:39:32

标签: objective-c cocoa nsnotificationcenter nsnotifications

我有一个名为MyButton的NSButton自定义类,我在其中发布了快速保存的通知 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)。

更新:我已经“解决”Interface Builder中的问题绑定,App作为AppDelegate委托,然后在[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(saveAction:) name:@"quickSave" object:nil];内添加-(void)applicationDidFinishLaunching:(NSNotification *)aNotification{...}。我不知道它是否是一个真正的解决方案,显然它不是我的问题的答案(为什么awakeFromNib被调用2次),但它可能对某人有用。有没有人有线索?

UPDATE2:正确的managedobjectcontext是第二次在awakeFromNib中调用的那个,第一个(awakeFromNibapplicationDidFinishLaunching中相同)是错误的。 我的应用程序是状态栏应用程序,第一个awakeFromNib在我启动应用程序时调用,第二个在打开首选项窗口时调用。

1 个答案:

答案 0 :(得分:0)

日志消息指示AppDelegate的两个不同实例接收单个通知。可能你曾两次实例化AppDelegate。确保您没有手动执行[[AppDelegate alloc] init]或其他操作,也没有在NIB中放置多个AppDelegate对象。