如何使对象成为窗口的委托?

时间:2011-10-09 04:44:27

标签: c# macos mono monomac

我试图用Xcode 4弄清楚MonoMac,大多数事情似乎都有效。但是,我无法弄清楚如何让windowWillClose:工作。

我添加了

[Export ("windowWillClose:")]
    void windowWillClose(NSNotification notification)
    {
        Environment.Exit(0);    
    }

到MainWindow.cs并使MainWindow成为窗口的委托。 (我尝试将MainWindowController作为委托,但这根本不起作用。)

但是,当我关闭窗口时,委托方法不会被调用。

我在俯瞰什么?

2 个答案:

答案 0 :(得分:1)

使用图片:http://www.netneurotic.net/Mono/MonoMac-windowWillClose.html

这里的技巧是创建一个方法,调用Environment.Exit()来退出应用程序,就像任何其他.NET应用程序一样。

另一个技巧是注意到当Cocoa对象存活时Environment.Exit()不起作用。但NSApplication.SharedApplication.Terminate(this)有效。我不知道如何以这种方式返回错误代码。

Cocoa和MonoMac使用“委托”允许一个对象在另一个对象发生某些事件时作出反应。我们将使用这个概念在主窗口关闭时调用Terminate()。

Cocoa对象有“outlet”,它们似乎是指向其他对象的指针。我不知道这在技术上是否是正确的描述。没关系。其中一个出口是“委托”,我们将设置为包含窗口关闭时我们想要调用的方法的对象。因此,我们必须将主窗口的委托出口设置为我们的对象。

我们将使用MainWindow.cs中定义的MainWindow类作为主窗口的委托。我想这意味着我们使用一个对象作为自己的委托或类似的东西。它仍然有效。

要使MainWindow成为主窗口的委托并对主窗口做出反应,请按照以下步骤操作。

  1. 双击MainWindow.xib以打开Xcode。

  2. 在Xcode中,找到主窗口。这是一个看起来像窗户的大事。

  3. 图1:标题为“窗口”的大事是主窗口。

    1. 右键单击窗口的标题栏以显示窗口的出口。
    2. 您将看到一个名为“委托”的商店。

      图2:其中一个“奥特莱斯”是“代表”。

      1. 找到“对象库”及其中的蓝色框。蓝框是一个对象。
      2. 图3:蓝框是一个对象。

        1. 使用窗口左侧的图标将蓝色框拖动到灰色的东西。
        2. 图4:蓝色框属于窗口图标。

          1. 将蓝色框设为“MainWindow”对象。单击蓝色框并将其类更改为“MainWindow”。
          2. 图5:更新蓝框的类名。

            1. 按控制键并从窗口标题栏拖动到蓝色框中。然后在出现的菜单中选择“委托”选项。
            2. 图6:控制拖动时出现的菜单。

              我们的MainWindow对象现在是主窗口的委托。这意味着它可以对发生在窗口中的事情作出反应。

              1. 将以下代码添加到MainWindow.cs:

                [导出( “windowWillClose:”)] public void WindowWillClose(NSNotification notification) {     Console.WriteLine( “windowWillClose:”);     NSApplication.SharedApplication.Terminate(本);
                }

              2. [Export(“windowWillClose:”)]语句告诉编译器(可能是编译器,但可能是技术上其他一些实用程序被告知)以下方法声明是宣布的Objective-C方法的C#等价物。该方法可以具有不同的实际名称,但应该以足够相似的名称命名,以便我们可以轻松地识别它。我通常只是将第一个字母更改为大写版本以符合C#样式。

                1. 编译应用程序,修复所有拼写错误,然后运行它。尝试关闭窗口。该应用程序将退出。
                2. 如果没有,请重复所述的所有步骤,直至确实如此。

答案 1 :(得分:0)

您提到过,您将MainWindowController作为委托我建议,创建继承自NSWindowDelegate的单独/内部类,覆盖WillClose (NSNotification notification)方法并将其设置为Window Delegate 。工作完成了。

代码:

    class MyDelegate:NSWindowDelegate
    {
        public override void WillClose (NSNotification notification)
        {

        }
    }

在AwakeFromNib方法中添加:

Window.Delegate = new MyDelegate();