問題タブ [nspopover]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
cocoa - ファーストレスポンダと NSPopover への対処方法
銘柄記号と名前を検索するために、iTunes の検索フィールドの動作を再現しようとしています。具体的には、検索フィールドに入力を開始すると、フィルタリングされたアイテムを含むポップオーバーが表示されます。ほとんどの場合、これは機能していますが、複製できないのは、ファーストレスポンダーの処理方法です
3文字入力するとポップオーバーが表示されます。この時点で、NSSearchField はファーストレスポンダーのステータスを失うため、入力を続けることができなくなります。私が望む動作は、ポップオーバーが表示された後、矢印キーでアイテムをスクロールして入力を再開し、検索フィールドの最後の文字から続行する機能です。
私が試したのは、NSTextView のサブクラス化 (これを NSSearchField のカスタム フィールド エディターとして使用) とオーバーライドです。
NO を返すだけで、ポップオーバーが表示されたら入力を続けることができますが、明らかに、ポップオーバー内の項目を選択することはできません。下向き矢印またはマウスダウンイベントが発生した場合にYESを返す次のことを試しました。
これは mousedown イベントでは機能しますが、keydown イベントでは機能しません。さらに、ユーザーが入力を再開したときに、これは問題に対処しません。
助言がありますか?
objective-c - フォーカスなしで NSPopover を表示
テキスト フィールドに入力しているユーザーに有効な構文を示す IntelliSense スタイルのポップオーバーの作成に取り組んでいます。ユーザーが textField に引き続き入力できるように、フォーカスを与えずに NSPopover を表示する方法を知っている人はいますか? ポップオーバーは controlTextDidChange によってトリガーされます。
macos - NSPopover 内の NSView: 座標の変換
環境
をNSPopoverP
とし、view
に含まれるサブビューである NSView にしますP
。
私が必要なもの
のフレームを取得して、画面の座標系view
に変換したい。通常、次のようにします。
ただし、view
は NSPopover にあるため、そのwindow
プロパティは nil であり、上記のメソッドは NSZeroRect: [0, 0, 0, 0] を返します。
では、ビューが NSPopover にある場合、ビューのフレームを画面座標で取得するにはどうすればよいでしょうか?
ノート:
- NSPopover は画面上に表示されます。
- フレームを画面座標に変換しようとしているビューは、NSPopover またはその contentView の直接のサブビューではありません。問題のビューは、実際には、NSClipView 内の NSScrollView 内の NSTableView 内の NSTableCellView 内のカスタム NSView です。clipView は、NSPopover の contentView の直接のサブビューです。
- 通常の NSWindow では、任意のサブビュー
[self window]
を取得して呼び出し、含まれている NSWindow オブジェクトを取得できます。ただし、ポップオーバーでそれを行うと、nil が返されます。
objective-c - ステータス バー NSPopover がメイン ウィンドウをアクティブにしないようにする
NSPopover
カスタムビューとして設定することで、ステータスバーに表示させています。その動作を Transient に設定し、グローバル イベント モニターも追加して、他のアプリケーションがフォーカスを取得すると が消えるようにNSPopover
しました。
これはかなりうまく機能していますが、私が直面している唯一の問題は、ポップオーバーをクリックすると、アプリケーションのメイン ウィンドウにフォーカスが移ることです。あるスペースにウィンドウを配置し、別のスペースでポップオーバーを表示してポップオーバーを操作すると、メイン ウィンドウのあるスペースに戻され、フォーカスされます。これを防ぐ方法はありますか?おそらく、アプリケーションをアクティブ化せずにポップオーバーとの対話を許可しますか?
cocoa - NSPopover で NSNumberFormatter を使用する
NSNumberFormatter (またはおそらく他の NSFormatter) を NSPopover で動作させる方法はありますか?
ポップオーバーの NSTextField の値は、NSViewController の presentedObject にバインドされます。フィールドに無効な数値 (「asdf」など) が入力されると、ポップオーバーを表示した NSView を含む NSWindow に値が無効であることを示すシートが表示されます。
[OK] をクリックするとすぐに、次のバックトレースが表示されます。
クラッシュ時の objc_msgSend のレジスタは次のとおりです。
これは、シートが表示された後に一時的なポップオーバーのウィンドウが消えたためであり、現在のエディターとセレクターに応答できるオブジェクトも消えたためだと思います。
ポップオーバーの動作を NSPopoverBehaviorSemitransient に設定すると多少は効果がありますが、テキスト フィールドに無効な値が入力されてポップオーバーが閉じられた場合でも例外がスローされます。
この時点で、この問題を回避するために考えられるのは、数値を手動で検証することだけです。うん。
更新 1
Brian Webster が以下で発見したように、これは AppKit の根本的な問題です。
私の検証のニーズは非常に単純 (正の整数のみ) だったので、回避策は、NSPopover によって表示される NSViewController でpresentedObject として使用される KVC オブジェクトで手動検証を行うことでした。NSTextFieldは実際には文字列値を使用する必要があるため、-valueForKey: と -setValue:forKey: を使用してスカラー値を変換します。テキスト フィールドのバインドされた値に対して [すぐに検証する] をオンにすると、テキスト フィールドが変更されるたびに検証メソッドが呼び出されます。
(質問する前に、NSValueTransformer は検証プロセスに関与していないため、この作業を実行できません。フィールドにデータが入力されるか、変更が保存されたときにのみ呼び出されます。ユーザーが無効なものを入力したらすぐにフィードバックが必要でした。 data -- NSFormatter が行うように。)
これが私がやったことの要点です:
今、私はシャワーを浴びる必要があります。
更新 2
@PixelCutCompany からの、PaintCode アプリでの処理方法に関するいくつかの役立つヒントに感謝します。
https://twitter.com/PixelCutCompany/status/441695942774104064 https://twitter.com/PixelCutCompany/status/441696198140125184
私はこれを思いついた:
基本的に、常に有効な値を指定することで、シートまたはダイアログの問題を回避できます。上記のコードは、デフォルト値を割り当てるときに最小値と最大値を考慮します。サブクラスは、クランプ値だけでなく、nil または空の文字列も考慮します。
これにより、汚れをあまり感じなくなります。
objective-c - Objective-C/Cocoa では、ミッション コントロールがアクティブになったときやスペースが変更されたときのグローバル イベントはありますか?
私は現在、カスタム ステータス アイテム ビューと NSPopover を使用してコンテンツを表示する OSX メニューバー アプリに取り組んでいます。
ポップオーバーはウィンドウのようにスペースを移動しないため、またはミッションコントローラーがアクティブ化されたときなど、スペースが変更されたときのように意味のあるときにそれを却下しようとしています。
現在、ミッション コントロール中は、このスクリーンショットに示すように、NSPopover が一番上に表示されます。
現在NSEvent addGlobalMonitorForEventsMatchingMask:
、いくつかのマウス イベント マスクを使用していますが、問題なく動作しますが、必要なすべてのイベントをカバーしていません。
では、ミッション コントロールを開く、スペースを変更するなどの主要な OS イベントがいつ発生したかを検出する方法はありますか?
どんな助けでも大歓迎です。