0

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 回呼び出されていることがわかります。なんで?

selector:PS: 通知は、フィールドに挿入するすべての関数を 2 回呼び出すため、2 回呼び出さ-(void)awakeFromNib{...}れていることがわかります (awakeFromNib 内に 2 つの異なる自己があります)。

更新: Interface Builder でアプリケーションを AppDelegate デリゲートとしてバインドし[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(saveAction:) name:@"quickSave" object:nil];-(void)applicationDidFinishLaunching:(NSNotification *)aNotification{...}. それが本当の解決策であるかどうかはわかりませんが、明らかに私の質問に対する答えではありません(なぜ awakeFromNib が2回呼び出されるのか)が、誰かにとって役立つかもしれません。誰も手がかりを持っていますか?

UPDATE2: 正しい managedobjectcontext は 2 回目に呼び出されたもので、最初のもの (とawakeFromNibで同じ) は間違っています。私のアプリはステータスバーアプリです。アプリを起動すると最初のawakeFromNibが呼び出され、設定ウィンドウが開いたときに2番目のアプリが呼び出されます。awakeFromNibapplicationDidFinishLaunching

4

1 に答える 1

0

ログ メッセージは、AppDelegate の 2 つの異なるインスタンスが 1 つの通知を受け取ることを示しています。おそらく、AppDelegate を 2 回インスタンス化しました。手動で[[AppDelegate alloc] init]何かを行ったり、複数の AppDelegate オブジェクトを NIB に配置したりしていないことを確認してください。

于 2013-06-26T05:59:30.590 に答える