0

私はかなり長い間これに固執していて、解決策をインターネットで広範囲に検索しました... IBの接続は正しく設定されており、次のようにawakeFromNibでNSWindowを開くことができます。

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

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

このメソッドとそこから呼び出されるメソッドで問題が発生します-NSWindowは開きません:

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; 
}

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

4

2 に答える 2

1

ホット キー ハンドル関数は、Objective-C インスタンス メソッドではなく C 関数であるため、「自己」オブジェクトの概念がありません。ローカル変数を宣言してこれを回避しようとしましたselfが、目的のオブジェクトを指していません。代わりに、それが指す新しい別のオブジェクトを作成しました。このオブジェクトは、アプリ内の残りのオブジェクトに接続されておらず、そのpopUpプロパティが何にも接続されていません (NIB から来ていないため)。 )。

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

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

于 2012-04-07T06:07:11.593 に答える
0

開いているが他の場所では開いてawakeFromNibいないという事実は、実際には配線されていないことを示唆していますが、ウィンドウは「起動時に開く」とマークされているため、たまたま機能します. popUpではないことを確認してくださいnil

于 2012-04-07T00:23:28.480 に答える