Cocoa处理消息的方法- Delegate

在Mac,Windows或者 Linux平台上,所有的GUI程序都可以称作消息驱动的,就是说整个应用程序就是在处理消息的循环中进行的,用户的操作或者系统发送的一些通知都会被送 到应用程序的消息处理循环中,比如用户通过键盘输入,用鼠标点击窗口等等,有些消息会直接派发给应用程序的对象,比如鼠标按下(MouseDown)的消 息就会直接被送给鼠标按下的那个窗口或者试图,但是有些消息会被系统首先解释,然后在生成其他的消息,比如用户用鼠标单击窗口Frame上的关闭按钮,这 个时候MouseDown事件并没有被送给应用程序的内部对象,而是在应用程序的消息循环中被解释成了窗口将要关闭的消息。

我们这次要处理的这个消息就是 应用程序最后一个窗口关闭的时候, 通知应用程序退出。

Cocoa中处理事件的方式有几种,其中一种是你可以重载类中的对应的事件处理方 法,比如MouseDown事件在NSResponse类中就被方法mouseDown:处理,所以所有继承自NSResponse的类都可以重载 mouseDown:方法来实现对MouseDown事件的处理。另外一种处理方式就是使用Delegate,当一个对象接受到某个事件或者通知的时候, 会向它的Delegate对象查询它是否能够响应这个事件或者通知,如果可以这个对象就会给它的Delegate对象发送一个消息(执行一个方法调用), 在代码中一般用如下的方式来实现。

if (delegate != nil && [delegate espondsToSelector:@selector(theEvent)]{

[delegate performSelector:@selector(theEvent)];

}

所以如果我们想处理一个对象的事件的话,就可以实现它所要求的方法,然后将实现了这个方法的类的实例作为Delegate对象赋值给发出事件的对象。

下面我们就用代码来说明。

 

 

#import 

@interface MyDelegate : NSObject {

}

- (BOOL)applicationShouldTerminateAfterLastWindowClosed:(NSApplication*)theApplication;

- (BOOL)windowShouldClose:(id)window;

@end

 

@implementation MyDelegate

- (BOOL)applicationShouldTerminateAfterLastWindowClosed:(NSApplication*)theApplication

{

    return YES;

}

 

- (BOOL)windowShouldClose:(id)window

{

    NSAlert* alert = [[NSAlert allocinit];

    [alert setAlertStyle:NSInformationalAlertStyle];

    [alert setMessageText:@"Are you sure you want to quit?"];

    [alert addButtonWithTitle:@"Yes"];

    [alert addButtonWithTitle:@"No"];

    NSInteger result = [alert runModal];

    if (result == NSAlertFirstButtonReturn)

    {

        [alert release];

        return YES;

    }

    [alert release];

    return NO;   

}

@end

 

 

int main(int argc, char *argv[])

{

    NSAutoreleasePool* pool = [[NSAutoreleasePool allocinit];

    [NSApplication sharedApplication];

    //Create the main window

    NSRect rc = NSMakeRect(00800600);

    NSUInteger uiStyle = NSTitledWindowMask | NSResizableWindowMask |NSClosableWindowMask;

    NSBackingStoreType backingStoreStyle = NSBackingStoreBuffered;

    NSWindow* win = [[NSWindow allocinitWithContentRect:rc styleMask:uiStylebacking:backingStoreStyle defer:NO];

    [win setTitle:@"HelloWin Test"];

    [win center]; //Center main Window

    [win makeKeyAndOrderFront:win];

    [win makeMainWindow];

    //Set delegate to application object

    MyDelegate* myDelegate = [[MyDelegate allocinit];

    //Use the same delegate object to window object

    [win setDelegate:myDelegate];

    [NSApp setDelegate:myDelegate];

    //Start the event loop by calling NSApp run

    [NSApp run];

    //Release the object

    [myDelegate release];

    [pool drain];

    return 0;

}

首先定义了一个类名字叫MyDelegate,然后里面实现了两个方法,这两个方法是分别对应NSApplication的一个消息和NSWindow的一 个消息,我们在实现Delegate对象的时候, 不比针对每个类的Delegate对象单独创建一个类,比如创建一个MyAppDelegate类,创建一个MyWindowDelegate对象,我们 也不需要将发出事件对象的所有的Delegate方法都实现,只选择我们需要的就可以了。 所以针对这个简单的应用程序, 我定义了一个Delegate对象,并且响应了2个对象的两个事件。

这个Delegate类处理的针对NSApplication的事件是

 

- (BOOL)applicationShouldTerminateAfterLastWindowClosed:(NSApplication*)theApplication

这个事件是在应用程序的最后一个窗口被关闭之后发出的,NSApplication中有一个窗口的列表,当最后一个窗口关掉的时候, 应用程序就会查询它的Delegate对象是否响应这个事件,如果响应这个事件,就调用这个方法,然后查看这个方法的返回值来决定是否退出应用程序。

在这个Delegate类中,这个事件的响应很简单,直接返回YES,告诉应用程序可以退出了,当然在具体的程序中,我们可以在这个事件中处理一些其他的工作,比如保存应用的设置或者释放一些全局的资源等等。

针对NSWindow的事件是

 

-(BOOL)windowShouldClose:(id)window;

这个事件是在一个窗口将要关掉的时候发出的,我们可以在这个事件中来防止错误的操作关掉了正在进行的工作,所以可以给用户弹出一个对话框,来确认是否真的要关闭这个窗口。

在 这个事件的处理中,我使用NSAlert类来完成这个简单的对话框,这演示了NSAlert类的强大功能,可以通过这个类来实现更多的这类对话框。另外有 些常用的对话框,比如Critical Error, Information对话框等,Cocoa中已经进行了包装,我们可以直接调用这些方法, 这样可以用更少的代码来完成这个工作。 比如NSRunAlertPanel, NSRunInformationalAlertPanel等等。

虽然我们的程序现在能够退出了, 但是窗口上面什么也没有, 实际上还是一个没有用的程序,如何来向窗口中增加内容呢?下次在说吧。



http://www.cocoachina.com/b/?p=124#more-124

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
eclipse-jee-2023-03-r-macosx-cocoa-x86_64.dmg 是一个针对 macOS 系统的 Eclipse JEE 版本的安装文件。Eclipse 是一款开源的、跨平台的集成开发环境,为软件开发者提供了丰富的工具和功能,特别是针对 JavaEE 开发。 这个安装文件的版本号是 2023-03-r,意味着它是在2023年3月发布的第一个有重要改进的版本。macOSx-cocoa-x86_64 则表示这个程序适用于 macOS 操作系统的 cocoa 架构和 x86_64 位的处理器。.dmg 是 macOS 系统上常用的磁盘映像文件的扩展名。 通过安装这个文件,你可以在你的 macOS 系统上使用 Eclipse JEE 版本进行 JavaEE 的开发工作。它提供了一系列的插件和工具,包括代码编辑器、调试器、自动补全、版本控制等,以支持 JavaEE 技术的开发。你可以轻松地创建、编译、运行和调试 JavaEE 项目,并且可以方便地导入和管理项目。 Eclipse JEE 版本还针对 JavaEE 开发提供了额外的功能和集成,比如支持服务器的管理和部署、Web 服务的开发和测试、数据源的管理等。你可以通过插件来进一步扩展它的功能,以满足你对开发环境的特殊需求。 总而言之,eclipse-jee-2023-03-r-macosx-cocoa-x86_64.dmg 是一款适用于 macOS 系统的 Eclipse JEE 开发环境的安装文件。安装后,你可以利用它进行 JavaEE 技术的开发,包括创建、编辑、运行和调试项目,并享受一系列丰富的功能和插件。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值