iOS 代理反向传值
发布日期:2021-05-09 04:04:00 浏览次数:17 分类:博客文章

本文共 1926 字,大约阅读时间需要 6 分钟。

 

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

假如我们有一个需求如下:界面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 
- (void)setValue:(NSString *)string;@end@interface BViewController : UIViewController//声明委托变量@property (weak,nonatomic) id
B_Delegate;@end

 

在BViewController.m中:

@interface BViewController ()
@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 ()
@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;}

最后的效果图如下:

 

输出日志:

由于本文用的是XIB,省略了部分UI细节,附上本文的代码链接:。

哪里写的不好,望评论指点。谢过~

 

上一篇:iOS UIAlertController
下一篇:iOS 代理协议

发表评论

最新留言

感谢大佬
[***.8.128.20]2025年03月28日 02时42分16秒