• iOS 代理反向传值


    在上篇博客 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;
    }
    复制代码

    最后的效果图如下:

    输出日志:

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

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

  • 相关阅读:
    diango-tinymce富文本编译器
    django 1.10以上版本,引入js
    linux中使用vi 打开文件时,能显示行号
    ubuntu 16.04 系统语言汉化
    ubuntu16.04 一些简单软件安装操作
    urllib -- ProxyHandler处理器(代理设置)
    urllib基本使用-Handler和自定义的opener()
    urllib基本使用 urlopen(),Request
    python3
    Ubuntu安装Mysql+Django+MySQLdb
  • 原文地址:https://www.cnblogs.com/zhangyubao/p/6994965.html
Copyright © 2020-2023  润新知