3

NSTextField を含む NSPopover を表示する NSStatusItem がありますが、テキスト フィールドは編集できませんが、Xcode ではそうです。現在、これは既知のバグであり、誰かがここに投稿した解決策があるようです。私は本当にこのバグを回避する必要があります。

便宜上、ここで答えを引用します。

主な問題は、キーボード イベントの動作方法です。NSTextField (および彼のすべてのスーパービュー) はキーボード イベントを受け取りますが、彼は何もしません。これは、ポップオーバーがアタッチされているビューが、キー ウィンドウにならないウィンドウにあるために発生します。そのウィンドウにアクセスすることはできません。少なくとも私にはできませんでした。したがって、解決策は、カテゴリを使用して、アプリケーション内のすべての NSWindow に対してメソッド canBecomeKeyWindow をオーバーライドすることです。

NSWindow+canBecomeKeyWindow.h
@interface NSWindow (canBecomeKeyWindow)

@end

NSWindow+canBecomeKeyWindow.m
@implementation NSWindow (canBecomeKeyWindow)

//This is to fix a bug with 10.7 where an NSPopover with a text field cannot be edited if its parent window won't become key
//The pragma statements disable the corresponding warning for overriding an already-implemented method
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wobjc-protocol-method-implementation"
- (BOOL)canBecomeKeyWindow
{
    return YES;
}
#pragma clang diagnostic pop

@end

これにより、ポップオーバーが完全にレスポンシブになります。canBecomeKeyWindow に NO と応答する別のウィンドウが必要な場合は、いつでもサブクラスを作成できます。

私は自分が何をすべきかを本当に理解していません。これらの 2 つのファイル NSWindow+canBecomeKeyWindow (.h および .m) を作成するだけで済みますか? それは私にはうまくいかないからです。

これについてはよくわかりませんが、NSPopover を表示する NSWindow を実際に使用している場合にのみ機能しますか? NSWindow を使用していませんが、NSTextField を編集可能にするにはどうすればよいですか?

ありがとう。

4

1 に答える 1

4

はい、プロジェクトに NSWindow+canBecomeKeyWindow (.h および .m) ファイルを追加するだけで機能します。現在開発中のアプリでこの手法を使用していますが、問題なく動作します。NSWindow+canBecomeKeyWindow.m がプロジェクトのビルド フェーズの「コンパイル ソース」の下にリストされていることを確認してください。

余談ですが、NSPopover を使用して NSStatusItem からウィンドウを表示する際に別の問題が発生しています。私は実際に自分のプロジェクトでそれを使用しようとはしていませんが、これは代替手段として有望に見えます.

于 2012-05-03T04:06:40.137 に答える