0

我有一个名为 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第二次调用的,第一个(在awakeFromNiband中相同applicationDidFinishLaunching)是错误的。我的应用程序是一个状态栏应用程序,第一个 awakeFromNib 在我启动应用程序时调用,第二个在打开首选项窗口时调用。

4

1 回答 1

0

日志消息表明 AppDelegate 的两个不同实例收到一个通知。可能您两次实例化 AppDelegate。确保您没有手动[[AppDelegate alloc] init]做某事,并且没有在 NIB 中放置多个 AppDelegate 对象。

于 2013-06-26T05:59:30.590 回答