0

MonoMac アプリを作成していますが、BeginSheet に苦労しています。私はそれに多くの問題を抱えており、それらすべてに共通の問題であることを期待してそれらをリストします.

ログイン ウィンドウをシートとして表示するように BeginSheet を取得できましたが、アプリのメイン インターフェイスをアプリのプロパティで MainMenu ではなく MainWindow に設定すると、BeginSheet は何もしません。シートが閉じた後も、デリゲートは実行されません。Close() を呼び出して、LoginDialogController 内から LoginWindow を閉じます。

これは、MainWindowController で使用するコードです。

public override void WindowDidLoad ()
{
    base.WindowDidLoad ();

    Dialogs.LoginDialogController loginDialog = new Dialogs.LoginDialogController();
    loginDialog.Window.IsVisible = false;

    NSApplication.SharedApplication.BeginSheet(loginDialog.Window, Window, delegate {
        // THIS NEVER RUNS
        mainTabView.SelectAt(1);
        mainToolbar.SelectedItemIdentifier = "hometoolbaritem";
    });
}

私の他のビューの 1 つで、まったく効果のない次のコードを使用します。

TypeDialogController typeDialog = new TypeDialogController();
typeDialog.Window.IsVisible = false;
// THIS CALL HAS NO EFFECT
NSApplication.SharedApplication.BeginSheet(typeDialog.Window, View.Window, delegate {
    // THIS WILL PROBABLY NOT RUN EITHER, EVEN IF THE SHEET SHOWS
});

どんな助けでも大歓迎です。

4

1 に答える 1

0

アプリケーションのメイン インターフェイスを MainWindow に切り替えた場合、WindowDidLoad() メソッドは呼び出されません。これは、メソッドが MainWindow ではなく MainWindowController の一部であるためです。

イベントの通常のシーケンスは次のようなものです。

  1. MainMenu.xib は、アプリのメイン UI として開始されます
  2. MainMenu.xib は AppDelegate をインスタンス化します
  3. AppDelegate FinishedLaunching(NSObject notification) デリゲート メソッドが呼び出されます
  4. FinishedLaunching(NSObject notification) は MainWindowController の新しいインスタンスを構築し、それを使用して MainWindow を表示します
  5. MainWindowController WindowDidLoad() が呼び出され、コードが実行されます

メイン インターフェイスを MainWindow.xib に変更すると、次のようになります。

  1. MainWindow.xib は、アプリのメイン UI として開始されます。つまり、MainWindow のインスタンスが作成されますが、それを管理するためのコントローラーは作成されず、アプリ デリゲートは作成されません。

メイン インターフェイスを MainWindow.xib に変更することで何を達成しようとしているのか、私にはわかりません。おそらく、あなたが何を達成しようとしているのかを説明すれば、誰かが助けてくれるかもしれません.

シートで発生している問題に関しては、LoginDialogController でシートを適切に閉じていない可能性があります。Window.Close() を呼び出すだけでは不十分であり、ご覧のとおり、それ以上のシートが表示されなくなります。次のようなことをする必要があります:

NSApplication.SharedApplication.EndSheet(this.Window);
this.Window.OrderOut(sender);
this.Window.Close();

BeginSheet の呼び出しと EndSheet の呼び出しのバランスを取る必要があります。

これが問題でない場合は、LoginDialogController でシートを閉じる方法を示す必要があります。

于 2013-02-05T14:23:29.290 に答える