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

本文关键字:窗口 何使 对象 | 更新日期: 2023-09-27 18:10:58

我试图找出MonoMac与Xcode 4和大多数事情似乎工作。然而,我不知道如何让windowwwillclose:工作。

我添加了

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

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

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

我忽略了什么?

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

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

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

另一个技巧是注意Environment.Exit()在Cocoa对象处于活动状态时不起作用。但是nsapplication。sharedapplication。terminate (this)可以工作。我不知道怎么返回错误代码

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

Cocoa对象有"outlets",看起来像是指向其他对象的指针。我不知道这种描述在技术上是否正确。没关系。其中一个出口是"委托",我们将其设置为包含我们希望在窗口关闭时调用的方法的对象。因此,我们必须将主窗口的委托出口设置为我们的对象。

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

要使MainWindow成为主窗口的委托并响应主窗口的关闭,请遵循以下步骤。

  1. 双击主窗口。

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

图1:标题为"窗口"的大东西是主窗口。

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

你将看到一个名为"delegate"的出口。

图2:其中一个"outlet"是"delegate"

  1. 找到"Object Library"和其中的蓝色框。蓝框是一个对象。

图3:蓝色的盒子是一个物体。

    将蓝色方框拖到窗口左侧带有图标的灰色方框。

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

  1. 将蓝色框设置为"MainWindow"对象。点击蓝色方框,将其类更改为"MainWindow"。

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

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

图6:ctrl -拖动时出现的菜单

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

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

    (出口(windowWillClose: "))(NSNotification通知){Console.WriteLine("windowWillClose:");NSApplication.SharedApplication.Terminate(这);
    }

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

    编译应用程序,修复所有的拼写错误,然后运行它。试着关上窗户。应用程序将退出。

如果没有,重复这里告诉的所有步骤,直到出现

您提到,您将MainWindowController作为委托,我建议创建从NSWindowDelegate继承的单独/内部类,覆盖WillClose (NSNotification notification)方法并将其设置为窗口委托。任务完成。

代码:

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

在AwakeFromNib方法中添加:

Window.Delegate = new MyDelegate();