`
wsqwsq000
  • 浏览: 676829 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

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的方法。

 

分享到:
评论

相关推荐

    delegate委托

    从序言中,大家应该对委托和事件的重要性有点了解了吧,虽然说我们现在还是能模糊,但是从我的大白话系列中,我会把这些概念说的通俗易懂的。首先,我们还是先说说委托吧,从字面上理解,只要是中国人应该都知道这个...

    iPhone编程delegate示例

    本例子演示了iPhone开发中最常用到的两个类之间互相通信的方法之一:delegate

    C++中实现委托(delegate)

    网上有很多关于C++ delegate机制的文章,但都讲的是函数指针的内容,上周就C++中实现C#的delegate机制的问题研究了好几天,查看了很多相关资料,才解决了问题,现将我写的C++ delegate测试程序贴出来,希望能帮到有...

    多线程,Delegate 委托带参数的方法

    Delegate '委托,带参数的方法,多线程,可以轻松在线程中传递参数,获取返回值.

    objective-c委托机制(二)(delegate2)

    objective-c委托机制(二)对应源码,Delegate的实现代码。下载后可直接看到源码及注释。 Mac OS X 10.3.7 Xcode Version 4.3.2

    .Net的异步机制(委托Delegate)

    使用.Net 的委托机制来为我们的程序提供异步操作行为. 1步, 为我们的AsyncTest(Hello方法) 声明一个委托 public delegate string AsyncEventHandler(string name); 2步,使用委托提供的BeginInvoke, EndInvoke 方法...

    delegate 委托 示例 代码

    委托的简单理解: 参考了一些资料整合起来 写了个小程序,使您能充分理解和使用————delegate ,委托

    CSharp_Delegate C#委托

    CSharp_Delegate C#委托 本人博客中的示例代码

    C#由浅至深深度解析Delegate委托与Event事件

    委托 和 事件在 .Net Framework中的应用非常广泛,然而,较好地理解委托和事件对很多接触C#时间不长的人来说并不容易。它们就像是一道槛儿,过了这个槛的人,觉得真是太容易了,而没有过去的人每次见到委托和事件就...

    委托的简单实例 delegate 委托 匿名方法 自动属性 集合初始化器 类初始化器

    delegate 委托 匿名方法 自动属性 集合初始化器 类初始化器 委托方法

    C#使用委托(delegate)实现在两个form之间传递数据的方法

    本文实例讲述了C#使用委托(delegate)实现在两个form之间传递数据的方法。分享给大家供大家参考。具体分析如下: 关于Delegate【代理、委托】是C#中一个非常重要的概念,向前可以推演到C++的指针,向后可以延续到匿名...

    c#中关于委托delegate的经典的实例

    c#中关于委托delegate的经典的实例,可以使我们清楚的了解delegate的使用方法及含义。

    VB.Net-C#多线程Thread-代理委托delegate编程

    最近收集的VB.Net-C#多线程Thread-代理委托delegate编程。文章列表: c#.net多线程同步.txt C#WebBrowser页面与WinForm交互技巧一.txt C#多线程编程-多细全.txt C#多线程编程简单实例.txt C#多线程窗体控件安全访问....

    委托delegate invoke的简单源代码,适合委托初学者!

    委托delegate invoke的简单源代码,适合委托初学者!

    .Net C#委托 delegate

    本ppt结合场景和实例对C#委托(delegate)的基础进行了讲解:包括了委托的定义,基本语法,同步异步调用,匿名委托的使用,泛型委托,lamda表达式,剖析了委托协变、委托逆变。对委托在.net 3.5框架中的身影进行了分析...

    C#中的事件和委托(Delegate,Event)

    C#中的事件和委托(Delegate,Event)

    一种Delegate机制的设计与分析

    近年来.面向对象成为软件设计和开发的主流技术,然而基于继承的类...基础上,提出一种基于delegate机制的实现方法。分析和模拟实验结果表明,基于delegate机制的实现方法明显优于 前两者.可以有效地应用于软件开发。

    解析.Net 4.0 中委托delegate的使用详解

    .Net中的委托从功能上讲和c语言或者c++中的方法指针类似,可以像调用方法一样调用委托完成某个功能,或返回某类结果。但是.Net毕竟是更高级的语言,委托Delegate也更高级了,委托是一种数据接口,它包含调用目标和...

    委托的基本用法介绍项目

    Unity 项目中委托Delegate的用法,项目案例。 Chinar用简单的案例,帮您理解委托的基本用法,注册事件机制问题

    C#中的delegate委托类型基本学习教程

    主要介绍了C#中的delegate委托类型基本学习教程,委托是C#语言所具有的一个重要特性,需要的朋友可以参考下

Global site tag (gtag.js) - Google Analytics