iOS 代理的具体使用

最近看了一个代理的使用文档,觉着写的很好,记录一下

1.     创建一个 delegate;

2.    委托者声明一个delegate;

3.    委托者调用delegate内的方法(method);

4.    被委托者设置delegate,以便被委托者调用;

5.    被委托者实现Delegate 所定义的方法。

1.1    第一步: 创建一个delegate

在 .h 文件中,  通过 @protocol 创建一个 delegate:

@protocol CalculatorProgramsTableViewControllerDelegate

@optional

- (void)calculatorProgramsTableViewController:

(CalculatorPorgramTableViewController *)sender

choseProgram:(id)program;

@end

代码解释:

@protocol CalculatorProgramsTableViewControllerDelegate

用来创建一个delegate。  这个delegate 中有一个方法:

(void)calculatorProgramsTableViewController

@optional 表明,这个方法是不要求一定实现,是可选的。

小贴士:

这里需明确一个概念, 虽然通过@protocol 定义了一个delegate,但不能说, delegate 就是protocol。  前面提到过,delegate是一种架构设计模式。 在iOS中,它是通过@protocol 来实现的。

1.2    第二步: 委托者声明一个delegate

在TableView 的 .h 文件中 (CalculatorProgramsTableViewController.h), 将之前创建的delegate 通过@property 进行声明。 代码如下:

@interface CalculatorProgramsTableViewController : UITableViewController

...

// Define a property delegate

@property (nonatomic, weak) id<CalculatorProgramsTableViewControlerDelegate>

delegate;

...

@end

添加这几行代码后 , TableView 便拥有了Delegate。 有了Delegate, TableView就可以发消息了。 仅仅是可以发消息了,但还没有发。 下一步,Tableview 开始发送消息。

1.3    第三步:委托者调用delegate内的方法

我们的目标是:  当在TableView 上选择不同的函数时, TableView 将这个所选定的函数,告知绘制函数图形的GraphicView。

这一步,TableView  通过调用delegate的方法,发送消息。代码实现如下:

#progma mark - UITableViewDelegate

- (void)tableView:(UITableView *)tableView

didSeelectRowAtIndexPath:(NSIndexPath *)indexPath

{

id program = [self.programs objectAtIndex:indexPath.row];

[self.delegate calculatorProgramsTableViewController:self

choseProgram:porgram];

}

代码解释:

注意到 高亮部分的 self.delegate 了吧。 UITableView 就是通过这个之前定义的delegate 发送消息的。具体做法是: UITableViewController 调用delegate 中所定义的函数。通过这个函数的调用,  实现了消息的发送。但发到哪里去了,还不得而知。这是因为, self.delegate 还没赋值呢。

接下来,要做的是: 将  self.delegate  设置为GraphicView。

1.4     被委托者设置delegate,以便被委托者调用;

前面谈到, UITableViewController 中的self.delegate 还没有赋值。既然TableView 想把值传给Graphicview,  那就应该在calculatorGraphViewController.m 文件中设置delegate。 也就是说,让Graphicview 成为Tableview的delegate。

代码如下:

@implementation CalculatorGraphViewController

...

- (void)prepareForSegue:(UIStoryboardSegue *)segue

sender:(id)sender

{

if ([segue.identifier isEqualToString:@"Show Favorite Graphics"]) {

NSArray * programs = [[NSUserDefaults standardUserDefaults]

objectForKey:FAVORITES_KEY];

[segue.destinationViewController setPrograms:programs];

[segue.destinationViewController setDelegate:self];

// set delegate

}

}

代码解释:

但点击Graphicview 右上角的button 时, 会弹出一个Tableview。同时,在这段代码的最后一行,将CalculatorGraphViewController 设置为Tableview 的delegate。

通过这个设置, Tableview便可以调用Graphicview 所遵循的delegate 的的方法。

Delegate 的这个方法还没实现呢,  赶紧实现它吧。

1.5    被委托者实现Delegate 所定义的方法。

还记得那个神秘的 <> 吧。 通过以下代码,让GraphicViewController 来遵循这个delegate。

// .h to implement the protocol

@interface CalculatorGraphViewController :NSObject

<CalculatorProgramsTableViewControllerDelegate>

...

@end

这是delegate使用的最后一步了, 我们在segue的controller 文件中,实现这个protocol所定义的方法。代码如下:

// implement delegate method

- (void)calculatorProgramsTableViewController:(CalculatorProgramsTableViewController *)sender

chooseProgram:(id)program

{

self.calculatorProgram = program;

}

1.6    小结

通过以上delegate 五部曲的演示,我们对delegate的机制,清楚些了吧。 Delegate 实现了不同视图之间的数据交互。 Delegate 属于事件驱动的范畴。只有当某一事件触发时,delegate 才被调用。

在Cocoa 框架中, 虽然数据存储和访问的方式有多种, 但delegate 所独有的数据交互模式是无可替代的。

注:以上来自斯坦福iOS 教学。 这是一个经典的 delegate 应用案例。

时间: 2024-10-13 16:22:19

iOS 代理的具体使用的相关文章

iOS代理模式

iOS代理模式的简单理解:当一个对象无法直接获取到另一个对象的指针,又希望对那个变量进行一些操作时,可以使用代理模式. 代理主要由三部分组成: (1)协议:用来指定代理双方可以做什么,必须做什么. (2)代理:根据指定的协议,完成委托方需要实现的功能. (3)委托:根据指定的协议,指定代理去完成什么功能. 代理使用步骤 1.申明一个协议  (这个写在需要被获取的对象里面,也可以单独写一个类) @protocol TextDelegate -(void)deliverFirsttext:(NSSt

你真的了解iOS代理设计模式吗?

OS中消息传递方式 在iOS中有很多种消息传递方式,这里先简单介绍一下各种消息传递方式. 通知:在iOS中由通知中心进行消息接收和消息广播,是一种一对多的消息传递方式. 代理:是一种通用的设计模式,iOS中对代理支持的很好,由代理对象.委托者.协议三部分组成. block:iOS4.0中引入的一种回调方法,可以将回调处理代码直接写在block代码块中,看起来逻辑清晰代码整齐. target action:通过将对象传递到另一个类中,在另一个类中将该对象当做target的方式,来调用该对象方法,从

iOS 代理反向传值

在上篇博客 iOS代理协议 中,侧重解析了委托代理协议的概念等,本文将侧重于它们在开发中的应用. 假如我们有一个需求如下:界面A上面有一个button.一个label.从界面A跳转到界面B,在界面B的输入框中输入字符串,在界面A的label上显示.这是一个典型的反向传值的例子.这个例子的核心是:"在界面B的输入框中输入字符串,在界面A的label上显示".也就是说:"界面B委托界面A显示字符串,页面A是界面B的代理".委托方向代理方反向传值. 那么我们该怎么用代理设

IOS 代理的简单实现

原文 http://www.cnblogs.com/lovekarri/archive/2012/03/04/2379197.html 昨天做了一个demo,用到了简单代理. delegate是ios编程的一种设计模式.我们可以用这个设计模式来让单继承的objective-c类表现出它父类之外类的特征.昨天这个代理实现如下: 类GifView是继承自UIView的,它加载在RootViewController上来通过一个Timer播放动画.同时,RootViewController需要知道Tim

iOS代理一对一秒变一对多--RxSwift delegateProxy使用

委托代理(delegate) iOS 开发中十分常见.不管是使用系统自带的库,还是一些第三方组件时,我们总能看到 delegate 的身影.使用 delegate 可以实现代码的松耦合,减少代码复杂度.但如果我们项目中使用 RxSwift,那么原先的 delegate 方式与我们链式编程方式就不相称了. 解决办法就是将代理方法进行一层 Rx 封装,这样做不仅会减少许多不必要的工作(比如原先需要遵守不同的代理,并且要实现相应的代理方法),还会使得代码的聚合度更高,更加符合响应式编程的规范. 其实在

iOS 代理与通知,kvc和kvo的区别

通知 通知需要有一个通知中心:NSNotificationCenter,自定义通知的话需要给一个名字,然后监听. 优点:通知的发送者和接受者都不需要知道对方.可以指定接收通知的具体方法.通知名可以是任何字符串. 缺点:较键值观察(KVO)需要多点代码,在删掉前必须移除监听者. 协议 通过setDelegate来设置代理对象,最典型的例子是常用的TableView. 优点:支持它的类有详尽和具体信息. 缺点:该类必须支持委托.某一时间只能有一个委托连接到某一对象. KVO 的优点: 当有属性改变,

ios代理的使用,正向传值,逆向传值

#import <UIKit/UIKit.h> #import "SubViewController.h" @interface ViewController : UIViewController<SubViewControllerDelegate> @end #import "ViewController.h" @interface ViewController () { SubViewController *_subViewControl

IOS代理(初级)

协议的作用以及协议的用法 1.协议一般用作两个类之间的通信 2.协议声明了一组所有类对象都可以实现的借口 3.协议用@prltocol关键字声明 它本身不是类 4.参与协议的两个对象,代理者和委托者 5.代理,实现协议的某个方法,实现这个协议 6.委托,用自己的方法指定要实现协议方法的对象(代理),代理来实现对应的方法 [email protected]必须实现的方法  @optional---可以选择的方法  默认@required 例子: 这是一个简单的代理回调,包含传参 // 非正式协议

iOS代理02

代理阶段性小结 @required ->必须实现的方法 @optional  ->可选的实现方法-不强求实现-如果实现了能得到特殊的效果,如果不实现,也不影响程序的正确运行 能够增加控件的灵活度 1,遵守协议,预先定义好方法,不实践,具体的实现工作由代理负责 <控件的名字+DataSource> 定义的与数据有关的方法 <控件的名字+Delegate> 定义的与事件有关的方法,通常用来监听事件的 2,代理方法 1)方法名以控件名称开头(没有类前缀)->方便程序员编