当前位置: 代码迷 >> Iphone >> iphone中的delegate嘱托机制
  详细解决方案

iphone中的delegate嘱托机制

热度:49   发布时间:2016-04-25 06:34:30.0
iphone中的delegate委托机制

前言:iphone中如何使用委托机制,为什么要用委托机制?请先看下面的例子

?

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

?

在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只支持单继承,但可以实现多个协议(接口),语法如下:

?

Objective-c代码 复制代码?收藏代码
  1. @interface?Child?:?Parent?<Protocol1,Protocol2> ??
  2. ??
  3. { ??
  4. ??
  5. //成员变量定义 ??
  6. ??
  7. } ??
  8. ??
  9. //成员方法,类方法,属性定义 ??
  10. ??
  11. @end??

有了以上的知识后,我们就可以来定义自己的UIView了。

首先是定义一个UIView的子类。

?

Objective-c代码 复制代码?收藏代码
  1. @interface?MyUIView?:?UIView ??
  2. { ??
  3. ??
  4. //定义一些控件 ??
  5. ??
  6. id<MyUIViewDelegate>?delegate;?//这个定义会在后面的解释,它是一个协议,用来实现委托。 ??
  7. ??
  8. } ??
  9. ??
  10. //定义一些控件设置方法 ??
  11. @property?id<MyUIViewDelegate>?delegate;?//定义一个属性,可以用来进行get?set操作 ??
  12. ??
  13. @end??

然后定义一个Protocol,按照Cocoa的习惯,一般它以delegate结尾,熟悉C#的同学应该知道它的意义。其实不论是接口,委托,还是回调函数,本质上都做了一件事情。就是定义了一个操作契约,然后由用户自己来实现它的具体内容。

?

Objective-c代码 复制代码?收藏代码
  1. @protocol?MyUIViewDelegate ??
  2. ??
  3. //这里只需要声明方法 ??
  4. -?(void)func1 ??
  5. -?(int)func2:(int)arg ??
  6. ??
  7. @end??

完成以上两步之后就需要设计自己的UIViewController了。一般简单的做法,可以让这个Controller来实现上面定义的MyUIViewDelegate。在Cocoa框架中,很多控件和它的Controller都是采用的这种方式。

?

Java代码 复制代码?收藏代码
  1. @interface?MyUIViewController?:?UIViewController?<MyUIViewDelegate> ??
  2. { ??
  3. //成员变量 ??
  4. } ??
  5. ??
  6. //成员方法,类方法,属性 ??
  7. ??
  8. @end??

?

定义都完成了,到这里其实还看不出这三者是怎么联系起来的。那接下来就要看看,MyUIView和MyUIViewController的具体实现了。

?

首先是MyUIView的实现代码,假设在MyUIView在发生某个事件后会调用doSometing方法。

?

Objective-c代码 复制代码?收藏代码
  1. -?(void)doSomething ??
  2. { ??
  3. ????if(?delegate?!=?nil?)??//这里的delegate就是UIView定义时候的一个委托对象 ??
  4. ????{ ??
  5. ????????[delegate?func1];?//[]表示对一个对象发消息,如果在Java中会写成delegate.func1() ??
  6. ????} ??
  7. }??

上面的代码中 nil 相当于 Java中的 null,这里的意思就很明显了,如果delegate委托对象不为空,则调用相应的方法,但是这个委托对象的方法在哪里实现呢。可以看一下MyUIViewController的定义,它实现了MyUIViewDelegate。所以这个方法当然是由它来实现。代码如下

?

Objective-c代码 复制代码?收藏代码
  1. -?(id)init ??
  2. { ??
  3. ????MyUIView?*myView?=?[[MyUIView?alloc]?init];?//对MyUIView进行初始化 ??
  4. ????myView.delegate?=?self;?//将MyUIViewController自己的实例作为委托对象 ??
  5. ????self.view?=?myView;? ??
  6. } ??
  7. ??
  8. -?(void)func1 ??
  9. { ??
  10. ????//具体实现,可以加入Model相关的代码 ??
  11. }???

这么一来整个,整个代码的线路就明白了。

1.MyUIViewController初始化

2.MyUIViewController初始化时初始化MyUIView,并且将自己作为委托对象赋值给MyUIView

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

?

  相关解决方案