4

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

我添加了

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

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

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

我在看什么?

4

2 回答 2

1

配图: http: //www.netneurotic.net/Mono/MonoMac-windowWillClose.html

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

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

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

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

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

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

  1. 双击 MainWindow.xib 打开 Xcode。

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

图1:标题为“Window”的大东西是主窗口。

  1. 右键单击窗口的标题栏以显示窗口的出口。

您将看到一个名为“delegate”的出口。

图2:“Outlets”之一是“delegate”。

  1. 找到“对象库”和其中的蓝色框。蓝色框是一个对象。

图 3:蓝色框是一个物体。

  1. 将蓝色框拖到窗口左侧带有图标的灰色物体上。

图 4:蓝色框属于窗口图标下方。

  1. 使蓝色框成为“MainWindow”对象。单击蓝色框并将其类更改为“MainWindow”。

图 5:更新蓝色框的类名。

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

图 6:控制拖动时出现的菜单。

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

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

    [Export("windowWillClose:")] public void WindowWillClose(NSNotification notification) { Console.WriteLine("windowWillClose:"); NSApplication.SharedApplication.Terminate(this);
    }

[Export ("windowWillClose:")] 语句告诉编译器(可能是编译器,但可能是其他一些实用程序在技术上被告知)以下方法声明是 C# 中宣布的 Objective-C 方法的等效项。该方法可以有一个不同的实际名称,但应该有足够相似的名称,以便我们可以很容易地识别它。我通常只是将第一个字母更改为大写版本以符合 C# 风格。

  1. 编译应用程序,修正所有的错别字,然后运行它。尝试关闭窗口。应用程序将退出。

如果没有,请重复此处所述的所有步骤,直到完成为止。

于 2013-08-29T22:17:53.947 回答
0

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

代码:

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

        }
    }

在 AwakeFromNib 方法中添加:

Window.Delegate = new MyDelegate();
于 2011-10-12T18:18:39.880 回答