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番目のアプリが呼び出されます。awakeFromNib
applicationDidFinishLaunching