MonoMac BeginSheet问题

时间:2013-02-04 18:51:37

标签: mono monodevelop monomac

我正在编写一个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
});

任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:0)

当您将应用程序主界面切换到MainWindow时,不会调用WindowDidLoad()方法,因为该方法是MainWindowController的一部分,而不是MainWindow。

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

  1. MainMenu.xib作为应用程序的主UI
  2. 启动
  3. MainMenu.xib实例化AppDelegate
  4. AppDelegate FinishedLaunching(NSObject通知)委托方法称为
  5. FinishedLaunching(NSObject通知)构造一个MainWindowController的新实例,并用它来显示MainWindow
  6. 调用MainWindowController WindowDidLoad(),代码运行
  7. 当您将主界面更改为MainWindow.xib时,会发生这种情况

    1. MainWindow.xib作为应用程序的主UI启动。也就是说,创建了一个MainWindow实例,但没有控制器来管理它而没有应用程序委托
    2. 通过将主界面更改为MainWindow.xib,我不清楚您要实现的目标。也许如果你解释一下你想要达到的目标,也许有人可以提供帮助。

      关于您使用工作表遇到的问题,您似乎没有在LoginDialogController中正确关闭工作表。只是调用Window.Close()是不够的,并且会阻止显示更多的工作表,如您所见。你需要做这样的事情:

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

      您始终需要通过调用EndSheet来平衡对BeginSheet的调用。

      如果这不是您的问题,您需要在LoginDialogController中显示如何关闭工作表。