objective-c 回调函数学习(关于objective-c的代理,delegate,protocol相关)

objective-c 回调函数学习(关于objective-c的代理,delegate,protocol相关),第1张

概述在Cocoa框架中:所有的控件、窗口等都继承自 UIView,对应MVC中的 V。UIView及其子类主要负责UI的实现,而UIView所产生的事件都可以采用委托的方式,交给UIViewController实现。对于不同的UIView,都有相应的UIViewController 对应MVC中的C。比如在iPhone OS上常用的UITableView,它所对应的Controller就是UITab
在Cocoa框架中:所有的控件、窗口等都继承自 UIVIEw,对应MVC中的 V。UIVIEw及其子类主要负责UI的实现,而UIVIEw所产生的事件都可以采用委托的方式,交给UIVIEwController实现。对于不同的UIVIEw,都有相应的UIVIEwController 对应MVC中的C。比如在iPhone OS上常用的UItableVIEw,它所对应的Controller就是UItableVIEwController。至于MVC中的M,那需要根据用户自己的需求来实现了。 下面看一下一个自定义UIVIEw的架构是怎么样的。这之前要认识一下Objective-C中的几个重要的关键字。@interface 定义一个类,这个很容易和Java中的interface混淆。@protocol 定义一个协议,我跟喜欢把它理解成一个接口,相当于Java中的interface。Objective-C只支持单继承,但可以实现多个协议(接口),语法如下: @interface Child : Parent <Protocol1,Protocol2> { //成员变量定义 } //成员方法,类方法,属性定义 @end 有了以上的知识后,我们就可以来定义自己的UIVIEw了。首先是定义一个UIVIEw的子类。 @interface MyUIVIEw : UIVIEw { //定义一些控件 ID<MyUIVIEwDelegate> delegate; //这个定义会在后面的解释,它是一个协议,用来实现委托。} //定义一些控件设置方法 @property ID<MyUIVIEwDelegate> delegate; //定义一个属性,可以用来进行get set *** 作 @end 然后定义一个Protocol,按照Cocoa的习惯,一般它以delegate结尾,熟悉C#的同学应该知道它的意义。其实不论是接口,委托,还是回调函数,本质上都做了一件事情。就是定义了一个 *** 作契约,然后由用户自己来实现它的具体内容。 @protocol MyUIVIEwDelegate //这里只需要声明方法 - (voID)func1 - (int)func2:(int)arg @end 完成以上两步之后就需要设计自己的UIVIEwController了。一般简单的做法,可以让这个Controller来实现上面定义的MyUIVIEwDelegate。在Cocoa框架中,很多控件和它的Controller都是采用的这种方式。 @interface MyUIVIEwController : UIVIEwController <MyUIVIEwDelegate> { //成员变量 } //成员方法,类方法,属性 @end定义都完成了,到这里其实还看不出这三者是怎么联系起来的。那接下来就要看看,MyUIVIEw和MyUIVIEwController的具体实现了。首先是MyUIVIEw的实现代码,假设在MyUIVIEw在发生某个事件后会调用doSometing方法。- (voID)doSomething { if( delegate != nil ) //这里的delegate就是UIVIEw定义时候的一个委托对象 { [delegate func1]; //[]表示对一个对象发消息,如果在Java中会写成delegate.func1() } } 上面的代码中 nil 相当于 Java中的 null,这里的意思就很明显了,如果delegate委托对象不为空,则调用相应的方法,但是这个委托对象的方法在哪里实现呢。可以看一下MyUIVIEwController的定义,它实现了MyUIVIEwDelegate。所以这个方法当然是由它来实现。代码如下 - (ID)init { MyUIVIEw *myVIEw = [[MyUIVIEw alloc] init]; //对MyUIVIEw进行初始化 myVIEw.delegate = self; //将MyUIVIEwController自己的实例作为委托对象 self.vIEw = myVIEw; } - (voID)func1 { //具体实现,可以加入Model相关的代码 } 这么一来整个,整个代码的线路就明白了。1.MyUIVIEwController初始化2.MyUIVIEwController初始化时初始化MyUIVIEw,并且将自己作为委托对象赋值给MyUIVIEw3.MyUIVIEw发生事件,调用(回调)委托对象的方法,其实就是调用MyUIVIEwController的方法。再举一个简单的例子:一个VIEwController控制着AVIEw和BVIEw。现在要实现:AVIEw中点击切换到BVIEw,BVIEw中点击又切换回AVIEw中,并把BvIEw删除或隐藏。由于对模式不是很清楚,所以没想到用什么模式处理,如果有什么好的模式可以解决上述问题,希望大侠们指教哇。最后使用的方法是objective-c的代理。1.在BVIEw.h中定义一个代理:ID delegate; // A delegate that wants to act on events in this vIEw2.定义代理方法,这里使用到的是objective-c 的协议@interface NSObject ( BVIEwDelegate) -(voID)delegateMethod;@end注:以上写的协议为非正式的,所以,不用被设置代理者,不实现这个代理方法也是可以的。3.在点击中实现代码中,调用代理者实现的代理方法。在BVIEw.m中添加如何类似代码://设置了代理者,且代理者实现了delegateMethodif(delegate && [delegate respondsToSelector:@selector(delegateMethod)])         delegate delegateMethod];4.在AVIEm.m中设置BVIEw的代理,并实现delegateMethod方法即可:类似初始化中添加:[aVIEw setDelegate:self];-(voID)delegateMethod{      //control bVIEw code here      ...} 另外,关于正式协议:@protocol protocolname@optional -(voID)delegateMethodA@required -(voID)delegateMethodB// other methods...@end正式协议类似于java的借口或抽象类。@optional 的方法,可实现也可不实现,但@required 的方法必需实现。默认为@required。正式协议要求在代理类中声明采纳此代理,如:@interface Classname: NSObject <Protocolname>//...@end另外,在调用特殊代理方法前,需要通过conformstoprotocol函数来判断代理对象是否遵守定义的协议,如:if([mydelegate conformstoprotocol:@protocol(protocolname)]){       [mydelegate delegateMethod]; }或者使用respondsToSelector:@selector来判断代理对象是否实现相应的方法。
总结

以上是内存溢出为你收集整理的objective-c 回调函数学习(关于objective-c的代理,delegate,protocol相关)全部内容,希望文章能够帮你解决objective-c 回调函数学习(关于objective-c的代理,delegate,protocol相关)所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1059236.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-25
下一篇 2022-05-25

发表评论

登录后才能评论

评论列表(0条)

保存