objective-c delegate

objective-c的委托看似复杂,其实不然,从宏观上理解就是A将具体的实现交给B去做。例如:view类只管展示,但对其点击事件应该做什么,都交给B去做。

objective-c的委托有两种情况:


一、受委托类B和委托类A完全分离,伪代码如下:

委托类A:

@interface A

{

id<delegate> delegate;

}

@property id<delegate> delegate;

...

@end


协议:

@protocol delegate

-(void)func1;

@end


受委托类B:

@interface B:<delegate>

@end

@implementation B

-(void)func1

{

...

}


main()

{

A *a = [[A alloc]init];

B *b = [[B alloc]init];

a.delegate = b;

[a.delegate func1];

[a release];

[b release];

}


二、在iphone开发中,View类本身就带有delegate成员变量,只是默认为空。

   将代理执行的事件函数也放在view中,设置self.delegate=self. 当产生点击事件时,则会发送消息到delegate,当查到delegate所指示就为自己,就可以通过[delegate func1]调用实现方法。相当于回调函数,将具体实现放在函数里。伪代码如下:

@interface View <delegate>

{

id<delegate> delegate;

}

@end

@implementation View

@property id<delegate> delegate;

-(void)func1

{

...

}

@end


调用:

-init()

{

View *v = [[View alloc]init];

        v.delegate = self; //将自己的实例作为委托对象

self.view = v;

}


另可参考(转载):


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. @end 

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

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

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

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

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

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

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

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

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

1.MyUIViewController初始化

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

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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Objective-C 的委托模式是一种常用的设计模式,它用于将对象之间的通信解耦。在委托模式中,一个对象(称为委托方)将某些行为委托给另一个对象(称为代理方)来处理。 在 Objective-C 中,委托模式通常使用协议来实现。委托方定义一个协议,并声明一些必需或可选的方法,代理方实现这些方法来处理委托方所委托的行为。委托方可以将自身作为参数传递给代理方,以便代理方在处理这些行为时可以与委托方进行通信。 下面是一个简单的委托模式示例,其中定义了一个协议 `MyDelegate`,并通过委托将行为委托给另一个对象 `MyClass`: ``` @protocol MyDelegate - (void)doSomething; @end @interface MyClass : NSObject @property (nonatomic, weak) id<MyDelegate> delegate; - (void)start; @end @implementation MyClass - (void)start { // 委托方调用代理方实现的方法 [self.delegate doSomething]; } @end ``` 在上面的示例中,`MyClass` 定义了一个属性 `delegate`,用于保存代理方的实例。在 `start` 方法中,委托方调用代理方实现的 `doSomething` 方法。 现在假设我们有一个对象 `MyDelegateObject`,它实现了 `MyDelegate` 协议中的 `doSomething` 方法: ``` @interface MyDelegateObject : NSObject<MyDelegate> @end @implementation MyDelegateObject - (void)doSomething { NSLog(@"Do something..."); } @end ``` 我们可以将 `MyDelegateObject` 实例作为 `MyClass` 的代理,并启动 `MyClass` 实例来执行委托: ``` MyClass *myClass = [[MyClass alloc] init]; MyDelegateObject *delegateObject = [[MyDelegateObject alloc] init]; myClass.delegate = delegateObject; [myClass start]; ``` 在上面的代码中,我们创建了一个 `MyClass` 实例和一个 `MyDelegateObject` 实例,并将 `delegateObject` 设置为 `myClass` 的代理。当 `start` 方法被调用时,`MyDelegateObject` 实例的 `doSomething` 方法将被执行,输出日志 "Do something..."。 通过委托模式,我们可以将对象之间的通信解耦,并使对象之间的关系更加灵活。委托模式在 iOS 开发中有很多应用,例如 UITableView 和 UICollectionView 的委托。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值