2012-04-16 9 views
2

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

私は便宜のためにここに答えを引用します:

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

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と応答しなければならない別のウィンドウが必要な場合は、いつでもサブクラスを作成できます。

私は何をすべきか分かりません。 NSWindow + canBecomeKeyWindow(.hと.m)の2つのファイルを作成するだけですか?それは私のために働かないので。

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

ありがとうございました。

答えて

3

はい、プロジェクトにNSWindow + canBecomeKeyWindow(.hと.m)ファイルを追加するだけで動作します。私は現在開発中のアプリでこのテクニックを使用していますが、うまくいきます。プロジェクトのビルドフェーズでNSWindow + canBecomeKeyWindow.mが "Compile Sources"の下に表示されていることを確認してください。

他にも、NSPopoverを使用してNSStatusItemのウィンドウを表示する際に、他の問題が発生しています。私は実際に私のプロジェクトでそれを使用しようとはしていませんが、thisは代替として有望です。

+0

お返事ありがとうございます。私はAppleがすぐにこれを修正することを願っています私も代替案を探しましたが、将来的に他の人たちが永遠にアップデートしないかもしれないので、Appleのコードに頼っています。 – iMaddin