如何使一个对象成为窗口的代理?

4

我正在尝试在Xcode 4中使用MonoMac,大部分都可以正常工作。然而,我无法弄清如何使windowWillClose:函数起作用。

我添加了

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

我把代码加到了 MainWindow.cs 文件中,并将 MainWindow 设为窗口的委托。(尝试将 MainWindowController 设为委托,但是这样不起作用。)

然而,当我关闭窗口时,委托方法没有被调用。

我漏掉了什么?


你最终解决了这个问题吗?看起来我们应该能够使MainWindowController也成为代理。 - tofutim
既然你提到了,是的,谢谢你提醒我。 - Andrew J. Brehm
帮帮我,我一整天都在试图弄清楚这个问题。 - tofutim
2个回答

1

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

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

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

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

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

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

要使MainWindow成为主窗口的委托并响应主窗口关闭,请按照以下步骤进行。

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

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

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

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

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

图片2:其中一个“输出口”是“delegate”。

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

图片3:蓝色框是一个对象。

  1. 将蓝色框拖到窗口左侧带有图标的灰色区域。

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

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

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

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

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

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

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

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

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

  1. 编译应用程序,修复您所做的所有拼写错误,然后运行它。尝试关闭窗口。应用程序将退出。

如果没有,请重复执行此处指示的所有步骤,直到它成功。


这段文本似乎并不太关心代码格式,继续将代码显示为一行长串。 - Andrew J. Brehm

0
你提到你将MainWindowController作为代理,我的建议是,创建一个继承自NSWindowDelegate的独立/内部类,重写WillClose(NSNotification notification)方法并将其设置为窗口代理。工作完成了。
代码:
    class MyDelegate:NSWindowDelegate
    {
        public override void WillClose (NSNotification notification)
        {

        }
    }

在 AwakeFromNib 方法中添加以下内容:
Window.Delegate = new MyDelegate();

我不认为我理解你的解决方案。有什么想法为什么我的尝试没有成功?如果MainWindow是窗口的委托,那么委托方法不应该起作用吗?为什么我不能将MainWindowController设置为委托? - Andrew J. Brehm

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接