IOS开发(37)之iphone开发中的delegate
先举一个例子:
假如"我"的本职工作之一是“接电话”,但"我"发现太忙了或来电太杂了,于是我聘请一位"秘书"分担我“接电话”的工作,如果电话是老板打来的,就让“秘书”将电话转接给“我”。。。
那么,“我”就是a object. “秘书”就是"我"的“delegate”。写成代码就是 -- [我 setdelegate:秘书];
delegate的概念出现与m(model-view-controller),protocol,单线继承 密切相关
the main value of delegation is that it allows you to easily customize the behavior of several objects in one central object.
cocoa 中处理事件的方式有几种,其中一种是你可以重载类中的对应的事件处理方 法,比如mousedown事件在nsresponse类中就被方法mousedown:处理,所以所有继承自nsresponse的类都可以重载 mousedown:方法来实现对mousedown事件的处理。
另外一种处理方式就是使用delegate,当一个对象接受到某个事件 或者通知的时候, 会向它的delegate对象查询它是否能够响应这个事件或者通知,如果可以这个对象就会给它的delegate对象发送一个消息(执行一个方法调用)
协议 protocol :
我说下我的理解。object-c 里没有多继承。那么又要避免做出一个对象什么都会(super class monster,huge ,super,waste)一个超能对象 本身是否定了面向对象的概念和真谛了。为了让代码更简洁,条理更清楚,可以将部分职责分离。
协议本身没有具体的实现。只规定了一些可以被其它类实现的接口。
@protocal uitextfielddelegate
-(bool) textfieldshouldreturn:(uitextfield *) textfield ;
@end
delegate 总是被定义为 assign @property
@interface uitextfield
@property (assign) id<uitextfielddelegate> delegate;
@end
(#add,到此,如果还看不出桥模式的基本是不懂c++的,"委托"这个词我觉得被滥用了,包含一个类成员变量然后利用它去调用其成员函数,岂不是太普通不过了,除了基本类型变量,类包含另一个类的对象或指针简直就是家常便饭,而桥模式以此基础上提升了一个层次,看似平常,其实伟大)
这样我们就在uitextfield内部声明一个委托(delegate),那么就需要委托的代理实现uitextfielddelegate 中约定的行为
// 首先, 在接口里边声明要使用谁的delegate
@interface delegatesampleviewcontroller : uiviewcontroller <uitextfielddelegate>
{}
@end
// 然后在实现文件中初始化的时候, 设置delegate为self(自己)
@implementation delegatesampleviewcontroller
// ....
uitextfield *textfield = [[uitextfield alloc] initwithframe:cgrectmake(0, 0, 300, 400)];
textfield.delegate = self;//设置当前的控制器为uitextfield的代理,相当于注册(指定)代理人
[textfield becomefirstresponder];
[cell.contentview addsubview:textfield];
[textfield release];
// ....
}
// 实现uitextfielddelegate中约定的行为
#pragma mark uitextfielddelegate method
// called when 'return' key pressed. return no to ignore.
- (bool)textfieldshouldreturn:(uitextfield *)textfield
{
[textfield resignfirstresponder];
return yes;
}
推荐阅读
-
IOS开发(37)之iphone开发中的delegate
-
详解iOS应用UI开发中的九宫格坐标计算与字典转换模型
-
iOS多线程应用开发中自定义NSOperation类的实例解析
-
解析iOS应用的UI开发中懒加载和xib的简单使用方法
-
IOS开发(41)之关于NSString和NSMutableString的retainCount
-
IOS开发(43)之10个迷惑新手的Cocoa&Objective-c开发问题
-
IOS开发(40)之objective-C 的内存管理之-引用计数
-
jsp 开发之struts2中s:select标签的使用
-
IOS开发(59)之Block Object的调用
-
IOS开发(48)之由init、loadView、viewDidLoad、viewDidUnload、dealloc的关系说起