在上篇博客 iOS代理协议 中,侧重解析了委托代理协议的概念等,本文将侧重于它们在开发中的应用。

假如我们有一个需求如下:界面A上面有一个button、一个label。从界面A跳转到界面B,在界面B的输入框中输入字符串,在界面A的label上显示。这是一个典型的反向传值的例子。这个例子的核心是:“在界面B的输入框中输入字符串,在界面A的label上显示”。也就是说:“界面B委托界面A显示字符串,页面A是界面B的代理”。委托方向代理方反向传值。

那么我们该怎么用代理设计模式来实现这个需求呢?

在程序中:

1.委托需要做的工作有:

1.1定义协议与方法

1.2声明委托变量

1.3设置代理

1.4通过委托变量调用委托方法

2.代理需要做的工作有:

2.1遵循协议

2.2实现委托方法

在BViewController.h中:

//定义协议与方法
@protocol DeliverDetegate <NSObject> - (void)setValue:(NSString *)string; @end @interface BViewController : UIViewController //声明委托变量
@property (weak,nonatomic) id<DeliverDetegate>B_Delegate; @end

在BViewController.m中:

@interface BViewController ()<UITextFieldDelegate>

@property (strong, nonatomic) IBOutlet UITextField *DeliverText;

@end
- (IBAction)DeliverAction:(id)sender {

    //通过委托变量调用委托方法
//输入则显示输入的字符串,未输入显示“未填写”
if (![_DeliverText.text isEqualToString:@""]) {
NSLog(@"B向A发送数据%@",_DeliverText.text);
//判断代理中的方法是否被实现,避免未被实现代理的程序崩溃
if ([self.B_Delegate respondsToSelector:@selector(setValue:)])
{
[self.B_Delegate setValue:_DeliverText.text];
}
}
else
{
NSLog(@"B向A发送数据%@",@"未填写");
//判断代理中的方法是否被实现,避免未被实现代理的程序崩溃
if ([self.B_Delegate respondsToSelector:@selector(setValue:)])
{
[self.B_Delegate setValue:@"未填写"];
}
} [self.navigationController popViewControllerAnimated:YES];
}

在AViewController.m中

#import "AViewController.h"
#import "BViewController.h" @interface AViewController ()<DeliverDetegate> @property (strong, nonatomic) IBOutlet UILabel *TextLabel; @end
- (IBAction)ReceiveAction:(id)sender {

    //遵循协议
BViewController*BVC = [[BViewController alloc]init];
BVC.B_Delegate = self;
[self.navigationController pushViewController:BVC animated:YES];
}
//实现委托方法,即实现的setValue方法
- (void)setValue:(NSString *)string
{
NSLog(@"A接收到B数据%@",string);
_TextLabel.text = string;
}

最后的效果图如下:

输出日志:

最新文章

  1. React Native 之 TextInput使用
  2. 用AE (Adobe After Effects) 处理视频
  3. sql server 去除(替换)空格,回车,换行 函数
  4. struts.xml配置详解
  5. JSP EL表达式 与输入有关的内置对象
  6. oracle全文检索
  7. IntelliJ IDEA---java的编译工具【转】
  8. c语言typedef的用法-解惑阿!很多天书般的东西解释的不错(转)
  9. 《使用shell位置变量进行目录文件的备份小脚本》
  10. 浏览器信息(Navigator)
  11. [LeetCode#116]Fraction to Recurring Decimal
  12. tomcat配置多实例
  13. js Function 加不加new 详解
  14. Codechef Not a Triangle题解
  15. viewpager处理(三):让viewpager不预加载下一页
  16. 很好的容斥思想 HDU 5514
  17. 访问器属性:setter()函数和getter()函数
  18. Struts标签库详解【2】
  19. redis 的简单使用
  20. Paint the Tree

热门文章

  1. linux 多台 主机的免登录ssh的配置
  2. 【转载】Grunt常用插件介绍
  3. [Node.js] ECMAScript 6中的生成器及koa小析
  4. Java魔法堂:注释和注释模板
  5. ToolBar、ActionBar与Menu的纠葛(以及navigationIcon、setHomeButtonEnabled、setDisplayHomeAsUpEnabled)
  6. 快速暴力解决Eclipse ADT和Android Studio兼容问题,创建同时兼容ADT和AS的安卓工程
  7. Scrum 项目 6.0
  8. 【C#】属性(Attribute)
  9. sql server:compare data from two tables
  10. 划分树---Feed the dogs