NSPanelキーウィンドウのステータスを付与せずに(メインアプリケーションウィンドウを辞任キーにする)、NSPanelファーストレスポンダーステータス内にNSViewを付与することは可能ですか?
ありがとう。
NSPanelキーウィンドウのステータスを付与せずに(メインアプリケーションウィンドウを辞任キーにする)、NSPanelファーストレスポンダーステータス内にNSViewを付与することは可能ですか?
ありがとう。
さて、これを理解することになりましたが、多くの調査が必要だったので、他の誰かが同じ問題に遭遇した場合に備えて、ここに詳細を投稿します。まず、いくつかの基本事項:
-isKeyWindow
ですが、ウィンドウのファーストレスポンダーステータスに含まれるビューは提供されません。私のシナリオ:
を含む子ウィンドウをメインのアプリケーションウィンドウに追加しましたNSTableView
(理由は無関係です)。子ウィンドウはでしNSPanel
たNSBorderlessWindowMask
。パネルをキーウィンドウにせずにファーストレスポンダーのステータスを与えたかったのNSTableView
は、メインウィンドウからフォーカスが奪われたためです(子ウィンドウの錯覚の要点は、子ウィンドウをメインウィンドウの一部のように見せることでした) 。
私が最初に試したのは、テーブルビューをだまして、isKeyWindow
returnをオーバーライドすることにより、キーウィンドウ内にあると思い込ませることYES
でした。これにより、テーブルビューは最初の応答者であるかのように描画されましたが、それでも最初の応答者のステータスは与えられませんでした。
ソリューション:
したがって、デフォルトでは、NSBorderlessWindowMaskはウィンドウがキーになることを許可しません。テーブルビューをファーストレスポンダーにするには、ウィンドウがキーである必要があるためcanBecomeKeyWindow
、ボーダレスウィンドウサブクラスでオーバーライドしてを返しYES
ます。もちろん、これはメインウィンドウから重要なステータスを奪いました。これは私が避けたかったことの1つでした。これを修正するために、メインウィンドウをサブクラス化し、次のメソッドをオーバーライドしました。
- (BOOL)isMainWindow
{
return YES;
}
- (BOOL)isKeyWindow
{
return ([NSApp isActive]) ? YES : [super isKeyWindow];
}
このサブクラスは、アプリケーションがアクティブであるかどうかをチェックし、アクティブである場合は常に返さYES
れるため、アプリケーションでアクティブなウィンドウに関係なく、メインウィンドウは常にキーであるかのように動作します。この種の方法では、複数のウィンドウを同時にキーにすることができるという錯覚を与え、メインウィンドウでキーウィンドウを失うことなく、キーウィンドウのステータスを別のウィンドウにシフトできます。お役に立てれば!