コンテキスト を表示すると、予期しない結果が発生しましたNSMenu
。menu
のプロパティを使用せずに、自分でメニューを提示していますNSResponder
。NSMenu
を提示することはブロッキング操作であることが判明しました。
新しいテンプレート プロジェクトでは、次のコードのみを追加しましたapplicationDidLaunch:
NSMenu *menu = [[NSMenu alloc] initWithTitle:@"Menu"];
[menu addItemWithTitle:@"Item 1" action:@selector(selected:) keyEquivalent:@""];
[menu addItemWithTitle:@"Item 2" action:@selector(selected:) keyEquivalent:@""];
[menu addItemWithTitle:@"Item 3" action:@selector(selected:) keyEquivalent:@""];
[menu popUpMenuPositioningItem:[menu itemAtIndex:0]
atLocation:CGPointMake(500, 500)
inView:nil];
NSLog(@"Context menu shown.");
popUpMenuPositioningItem:atLocation:inView:
アイテムを選択するか、外側をクリックしてメニューを自動的に閉じるまで、呼び出しは返されません。ログは、メニューが閉じられたときにのみ印刷されます。
なぜこれが起こるのですか?どうすればそれを防ぐことができますか?この問題についての言及がいくつか見つかりましたが、「解決策」は常に、NSMenu
ブロックを防ぐのではなく、バックグラウンドで他のことを実行することで構成されていました。
編集:
メニューをバックグラウンド スレッドで表示すると、メニューが応答しなくなり、内部または外部のクリックに反応しなくなります。
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{
[[menu popUpMenuPositioningItem:[menu itemAtIndex:0]
atLocation:CGPointMake(500, 500)
inView:nil];
});