NSSavePanelとNSOpenPanelのアクセサリビューに問題があります。
時々(非常に頻繁に)これらのパネルの1つを開くと、アクセサリビューが機能しません(ビューは表示されますが、コントロールが無効になっているように見えます)。
パネルを表示するためにこのコードを使用しています:
[openPanel beginSheetModalForWindow:appWindow completionHandler:openPanelHandler];
これは、app-sandboxが有効になっている場合にのみ発生します。
多くのテストを行った後、何が起こっているのかは、ビューが置き忘れられている(パネルに取り付けられていない)ことであることがわかりました。
Mission Controlを開いて、マウスポインターをアプリのウィンドウ上に移動すると、「非表示」ウィンドウが強調表示され、それを選択すると、アクセサリビューを制御できるようになります(すべてのコントロールが機能します)が、開いているパネルまたは保存パネルから切り離されているように見えますスクリーンショットに示されているように。
この動作をテストするためだけに新しいアプリを作成しようとしましたが、再現できなかったので、それは私のアプリと関係があると思います。
私が間違っているかもしれないことのヒントはありますか?
この問題を解決するためだけに、すべてを最初からコーディングしたくはありません。
編集
ちなみに、ウィンドウを閉じると、ウィンドウを閉じる直前に、アクセサリビューがコントロールの正しい値で点滅します。アプリケーションがパネルの表示に間に合うようにビューを追加していないようです。
アップデート1
アクセサリビューとして使用されるビューをサブクラス化したところ、
- (void)viewWillMoveToSuperview:(NSView *)newSuperview
と呼ばれますが
- (void)viewDidMoveToSuperview
ビューが正しく表示されていても呼び出されることはありませんが、これは正常な動作ですか?
アップデート2
呼び出す必要があることを確認し- (void)viewDidMoveToSuperview
ました。テストアプリでは、両方のメソッドが呼び出されます。
また、自分のアプリとテストアプリの間にわずかな違いがあることに気づきました。私のアプリでは、パネルは下にスライドするだけですが、テストアプリでは、パネルが「下にフリップ」しているように見えます(正確に説明する方法がわかりません)。パネルの表示方法は私には関係ありません。同じように表示されていないことに気づきました。