8

具体的には、テキスト フィールドのフォーカスに関して一貫性のない動作をします。

ステータス メニューをポップアップする LSUIElement があります。そのメニュー内には、テキスト フィールドを含むビューがあります。テキスト フィールドは選択可能である必要があります。必ずしもデフォルトで選択されるとは限りませんが、いずれかが選択されます。

ステータスアイテムがクリックされると、それがトリガーされます

[NSApp activateIgnoringOtherApps:YES];

* ステータス メニューの残りの半分は、それ自体が「バックグラウンドにある」と見なされているようで、クリックしてもテキスト フィールドにフォーカスを当てることができません。(ステータス アイテムのクリック トリガーは、NSLog があることで発生していることを知っています。)

これは Apple がこれらのステータス項目を処理する方法のバグですか、それとも activateIgnoringOtherApps の処理を​​誤っているのでしょうか?

※実際に別アプリ起動後の初回のみ失敗するようです。その後、正常に動作します。

完全なスニペット:

-(void)statusItemClicked:(id)sender {
    //show the popup menu associated with the status item.
    [statusItem popUpStatusItemMenu:statusMenu];

    //activate *after* showing the popup menu to obtain focus for the text field.
    [NSApp activateIgnoringOtherApps:YES];

}
4

2 に答える 2

2

最後に、これに対する回避策を考え出しました。

クリック ハンドラーでメニューをポップする代わりに、アプリをアクティブにしてから、遅延なしでメニューをポップする NSTimer をスケジュールします。

-(void)pop:(NSTimer *)timer {
    [statusItem popUpStatusItemMenu:theMenu];
}

-(void)statusItemClicked:sender {
    [NSApp activateIgnoringOtherApps:YES];
    [NSTimer scheduledTimerWithTimeInterval:0.0 target:self selector:@selector(pop:) userInfo:nil repeats:NO];
}

pop:次のフレームで呼び出されるため、遅延は感知できactivateIgnoringOtherApps:ませんが、同じフレームでメニューをポップするときに期待どおりに動作するのを妨げていたものを実行するのに十分な長さです。

于 2011-10-19T14:48:05.660 に答える
-1

経験上、テキスト フィールドを含むメニューをポップアップ表示したactivateIgnoringOtherApps: に呼び出す必要があることを知っています。したがって、次の順序で実行する必要があります。

- (void)statusItemClicked:sender {
    [statusItem popUpStatusItemMenu:theMenu];
    [NSApp activateIgnoringOtherApps:YES]; // FYI, NSApp is shorthand for [NSApplication sharedApplication]
}

あなたが言ったことに基づいて、アプリケーションのアクティブ化が遅すぎて、最初に項目をクリックしたときにアクティブ化されていないように思えますが、その後のクリックでは既にアクティブ化されています。

于 2009-12-07T17:50:47.183 に答える