5

NSPanelキーウィンドウのステータスを付与せずに(メインアプリケーションウィンドウを辞任キーにする)、NSPanelファーストレスポンダーステータス内にNSViewを付与することは可能ですか?

ありがとう。

4

1 に答える 1

8

さて、これを理解することになりましたが、多くの調査が必要だったので、他の誰かが同じ問題に遭遇した場合に備えて、ここに詳細を投稿します。まず、いくつかの基本事項:

  1. 2つのウィンドウを同時にキーにすることは不可能です
  2. オーバーライドすることでウィンドウを偽造してキーだと思わせることは可能-isKeyWindowですが、ウィンドウのファーストレスポンダーステータスに含まれるビューは提供されません。

私のシナリオ:

を含む子ウィンドウをメインのアプリケーションウィンドウに追加しましたNSTableView(理由は無関係です)。子ウィンドウはでしNSPanelNSBorderlessWindowMask。パネルをキーウィンドウにせずにファーストレスポンダーのステータスを与えたかったのNSTableViewは、メインウィンドウからフォーカスが奪われたためです(子ウィンドウの錯覚の要点は、子ウィンドウをメインウィンドウの一部のように見せることでした) 。

私が最初に試したのは、テーブルビューをだまして、isKeyWindowreturnをオーバーライドすることにより、キーウィンドウ内にあると思い込ませることYESでした。これにより、テーブルビューは最初の応答者であるかのように描画されましたが、それでも最初の応答者のステータスは与えられませんでした。

ソリューション:

したがって、デフォルトでは、NSBorderlessWindowMaskはウィンドウがキーになることを許可しません。テーブルビューをファーストレスポンダーにするには、ウィンドウがキーである必要があるためcanBecomeKeyWindow、ボーダレスウィンドウサブクラスでオーバーライドしてを返しYESます。もちろん、これはメインウィンドウから重要なステータスを奪いました。これは私が避けたかったことの1つでした。これを修正するために、メインウィンドウをサブクラス化し、次のメソッドをオーバーライドしました。

- (BOOL)isMainWindow
{
    return YES;
}

- (BOOL)isKeyWindow
{
    return ([NSApp isActive]) ? YES : [super isKeyWindow];
}

このサブクラスは、アプリケーションがアクティブであるかどうかをチェックし、アクティブである場合は常に返さYESれるため、アプリケーションでアクティブなウィンドウに関係なく、メインウィンドウは常にキーであるかのように動作します。この種の方法では、複数のウィンドウを同時にキーにすることができるという錯覚を与え、メインウィンドウでキーウィンドウを失うことなく、キーウィンドウのステータスを別のウィンドウにシフトできます。お役に立てれば!

于 2011-02-06T23:35:50.127 に答える