0

我正在编写一个 MonoMac 应用程序,但我正在努力使用 BeginSheet。我有很多问题,并会列出它们,希望这是一个普遍存在的问题。

我已经设法让我的 BeginSheet 将我的登录窗口显示为工作表,但是如果我在应用程序的属性中将应用程序的主界面设置为 MainWindow,而不是 MainMenu,那么 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";
    });
}

在我的其他观点之一中,我使用了以下绝对无效的代码:

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() 方法,因为该方法是 MainWindowController 的一部分,而不是 MainWindow。

正常的事件顺序是这样的:

  1. MainMenu.xib 作为应用程序的主 UI 启动
  2. MainMenu.xib 实例化 AppDelegate
  3. AppDelegate FinishedLaunching(NSObject 通知) 委托方法被调用
  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 回答