Cocoa系列教学三:Target & Action, 另外一种响应事件
2009-06-11 19:26
337 查看
我们知道在Cocoa程序中, 如果你想处理一个窗口的事件或者应用程序的事件, 你可以使用Delegate的方法来实现响应的事件处理函数,但是如果你要处理一个button控件或者一个窗口里面很多的类似Button的这种有一种 缺省行为的控件的时候, 是不是要为他们每个控件都来实现这个Delegate呢?
答案是否定的,因为针对这些具有指定的缺省行为的控件,NSControl已经帮我们进行了一部 分的处理(这个control要求继承自NSActionCell, 比如你添加一个Button到窗口中,那么对Button的Click事件,NSControl是有自己的处理的,这就是Target-Action模 式,当Button的click事件被触发时,NSControl就会去检查这个Control中是否有对应的Target,这个Target针对这个事 件处理的Action是什么,如果Target和Action都存在,那么这个Click事件就会被NSControl直接处理,类似的处理代码如下(假设的实现)
-(void) mouseClicked()
{
if (target != nil && action != nil && [target respondsToSelector:action])
{
[target performSelector:action withObject:self];
}
}
下面我们通过具体的代码来展示一下这个技术。
int main(int argc, char *argv[])
{
NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];
[NSApplication sharedApplication];
//Create main window
NSRect rc = NSMakeRect(0, 0, 800, 600);
NSUInteger uiStyle = NSTitledWindowMask | NSResizableWindowMask | NSClosableWindowMask;
NSBackingStoreType backingStoreStyle = NSBackingStoreBuffered;
NSWindow* win = [[NSWindow alloc] initWithContentRect:rc styleMask:uiStyle backing:backingStoreStyle defer:NO];
[win setTitle:@"HelloWin Test"];
//Create a button and set it as content view
NSButton* button = [[NSButton alloc] initWithFrame:NSMakeRect(200, 200, 60, 40)];
[button setTitle:@"Quit Application"];
[win setContentView:button];
//Set target and action
MyController* controller = [[MyController alloc] init];
[button setTarget:controller];
答案是否定的,因为针对这些具有指定的缺省行为的控件,NSControl已经帮我们进行了一部 分的处理(这个control要求继承自NSActionCell, 比如你添加一个Button到窗口中,那么对Button的Click事件,NSControl是有自己的处理的,这就是Target-Action模 式,当Button的click事件被触发时,NSControl就会去检查这个Control中是否有对应的Target,这个Target针对这个事 件处理的Action是什么,如果Target和Action都存在,那么这个Click事件就会被NSControl直接处理,类似的处理代码如下(假设的实现)
-(void) mouseClicked()
{
if (target != nil && action != nil && [target respondsToSelector:action])
{
[target performSelector:action withObject:self];
}
}
下面我们通过具体的代码来展示一下这个技术。
int main(int argc, char *argv[])
{
NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];
[NSApplication sharedApplication];
//Create main window
NSRect rc = NSMakeRect(0, 0, 800, 600);
NSUInteger uiStyle = NSTitledWindowMask | NSResizableWindowMask | NSClosableWindowMask;
NSBackingStoreType backingStoreStyle = NSBackingStoreBuffered;
NSWindow* win = [[NSWindow alloc] initWithContentRect:rc styleMask:uiStyle backing:backingStoreStyle defer:NO];
[win setTitle:@"HelloWin Test"];
//Create a button and set it as content view
NSButton* button = [[NSButton alloc] initWithFrame:NSMakeRect(200, 200, 60, 40)];
[button setTitle:@"Quit Application"];
[win setContentView:button];
//Set target and action
MyController* controller = [[MyController alloc] init];
[button setTarget:controller];
相关文章推荐
- [Cocoa] Target & Action, 另外一种响应事件的方法
- 【Tutorial】Target & Action, 另外一种响应事件的方法
- Target & Action, 另外一种响应事件的方法
- 【Cocoa(mac) Application 开发系列之四】动作编辑器(Cocos2dx)制作流程详解及附上响应鼠标滚轴事件、反转坐标系、导入/创建资源目录等知识点代码!
- JavaScript系列二:变量、数组、流程控制、函数以及事件响应
- LID&LDS 的另外一种算法
- Action示例(使用Action多触发响应事件)
- Android官方开发文档Training系列课程中文版:OpenGL绘图之响应触摸事件
- 【Unity&事件】事件监听响应的几种方法分析研究
- <iOS>响应事件传递, nextResponder研究
- Android自定义控件系列 十:利用添加自定义布局来搞定触摸事件的分发,解决组合界面中特定控件响应特定方向的事件
- 从零开始学_JavaScript_系列(八)——js系列<2>(事件触发顺序、文本读取、js编写ajax、输入验证、下拉菜单)
- Android-->Launcher拖拽事件详解【androidICS4.0--Launcher系列二】
- .NET基础扩展系列-如何获取事件的响应函数列表
- WPF系列之二:解耦View层控件事件与ViewModel层事件的响应
- 判断TCP通信结束的方法&&相对于trace有另外一种监测方法:monitor
- 委托、Lambda表达式、事件系列06,使用Action实现观察者模式,体验委托和事件的区别
- 读懂源码系列-FileZilla Server 设计原则分析-socket 事件响应流程(3)
- 【转】Javascript拖拽&拖放系列文章3之细说事件对象
- Table Control 响应双击事件…