2012-04-06 7 views
0

私はかなり長い間この問題に悩まされていましたが、私は遠くに解決策を探すためにインターネットを検索しました... IBの接続は正しく設定されていますawakeFromNibで私のNSWindowを開きましょう。NSWindowはOSStatusイベントハンドラメソッドで表示されません

NSApp activateIgnoringOtherApps:YES]; 
[popUp makeKeyAndOrderFront:nil]; 

問題なし。 awakeFromNibからメソッドを呼び出して、メソッド内の同じ2行を使ってウィンドウを開くこともできます。

問題は、この方法で発生し、そこから呼び出される任意の方法で - NSWindowのは開きません。あなたが見ることができるように、私は2つのアプローチを試してみた

OSStatus myHotKeyHandler(EventHandlerCallRef nextHandler, EventRef anEvent, void *userData) 
{ 
    GeronimoAppDelegate *self = [[GeronimoAppDelegate alloc] init]; 
    [self.popUp makeKeyAndOrderFront:nil]; 

    GeronimoAppDelegate *appDel = (GeronimoAppDelegate *)[NSApp delegate]; 
    [appDel.popUp makeKeyAndOrderFront:nil]; 

    //Run the timer method 
    [self runBackTimer]; 
    return noErr; 
} 

を参照して、ウィンドウを開くにはappdelegateしてNSWindowオブジェクトにアクセスしますが、どちらもうまくいきません。私は、このメソッドまたはそれから呼び出されるメソッドからウィンドウを開くことができる必要があります。私はオブジェクトを間違って参照している可能性がありますか? (これらのメソッドはすべて同じファイルにあります--GeronimoAppDelegate.m)

答えて

1

ホットキーハンドル関数は、Objective-CインスタンスメソッドではなくC関数であり、 "self"オブジェクトの概念を持ちません。ローカル変数selfを宣言してこの問題を回避しようとしましたが、関心のあるオブジェクトを指していません。代わりに、新しいオブジェクトを作成しました。これは、アプリケーションの残りのオブジェクトに接続されておらず、popUpプロパティが接続されていません。 NIB)。

アプリのデリゲートを参照すると効果があります。アプリケーションオブジェクトのdelegateアウトレットがNIBでインスタンス化されているアプリケーションデリゲートオブジェクトに接続されていますか?後で-setDelegate:を呼び出したり、.delegateプロパティに割り当てたりして、接続を解除したり再接続したりできますか?

通常、Cスタイルのコールバックをオブジェクト指向プログラムと統合するには、オブジェクトポインタをC関数に渡す必要があります。幸いにも、ホットキーコールバックシグネチャは、userDataパラメータでそのようなデザインに対応します。コールバックを登録するときは、呼び出されたときにコールバックに渡す必要があるユーザーデータとしてオブジェクトポインタを指定する必要があります。コールバックでは、適切な型のオブジェクトポインタ変数を宣言し、userDataを代入します(ARCでは__ブリッジキャストが必要です)。

+0

それだけです!私は、アプリケーションデリゲートに接続されたアプリケーションオブジェクトのデリゲートアウトレットを持っていませんでした。あなたは命の恩人です!どうもありがとう。 –

0

awakeFromNibで開きますが、実際には配線されていないことが示唆されていますが、ウィンドウは「起動時に開く」とマークされているので働くpopUpが実際にはnilでないことを確認してください。

+0

"popUp" NSWindowオブジェクトhttp://cl.ly/0N3p00323t2A0f0d2A1Qに接続されており、 "popUp makeKeyAndOrderFront:nil"で開くように呼び出すとawakeFromNibにのみ表示されます。 ; "接続は正常で、OSStatusメソッドとそのメソッドから呼び出されたものの外では期待どおりに動作しているようです。 –

関連する問題