回调函数 delegate,protocol

回调函数 delegate,protocol,第1张

概述Cocoa是Mac OS和iPhoneOS上的开发框架,使用Objective-C做为开发语言。当然,在代码中也可以嵌入C和C++的语句。初识Objective-C时会觉得它的语法很奇怪,但本质上和其他面向对象语言都差不多。具体语法大家可以参考相关文档。   在Cocoa框架中: 所有的控件、窗口等都继承自 UIView,对应MVC中的V。UIView及其子类主要负责UI的实现,而UIView所产

Cocoa是Mac OS和iPhoneOS上的开发框架,使用Objective-C做为开发语言。当然,在代码中也可以嵌入C和C++的语句。初识Objective-C时会觉得它的语法很奇怪,但本质上和其他面向对象语言都差不多。具体语法大家可以参考相关文档。

 

在Cocoa框架中:

所有的控件、窗口等都继承自 UIVIEw,对应MVC中的V。UIVIEw及其子类主要负责UI的实现,而UIVIEw所产生的事件都可以采用委托的方式,交给UIVIEwController实现。对于不同的UIVIEw,都有相应的UIVIEwController 对应MVC中的C。比如在iPhoneOS上常用的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;//这个定义会在后面的解释,它是一个协议,用来实现委托。 } //定义一些控件设置方法 @propertyID<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,并且将自己作为委托对象赋值给MyUIVIEw

3.MyUIVIEw发生事件,调用(回调)委托对象的方法,其实就是调用MyUIVIEwController的方法。

总结

以上是内存溢出为你收集整理的回调函数 delegate,protocol全部内容,希望文章能够帮你解决回调函数 delegate,protocol所遇到的程序开发问题。

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

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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存