IOS 界面传值实现的6种方式(二)

时间:2021-10-02 20:43:51

前景笔记:IOS  界面传值实现的6种方式(一)介绍了三种界面传值方法:属性传值、单例传值、NSUserDefaults传值。

四、代理传值

根据下面的示意图,了解代理的原理,与java中的写法基本相同。

IOS 界面传值实现的6种方式(二)

莫名的写了一下java代码,功能是:AClass向自己的接口对象方法中发生数据,BClass实现Delegate接口,并打印接口方法收到的数据,实现基本的通讯。代码如下。

interface  Delegate{    void data(String clsName,String str);
}

public class AClass {

//定义一个接口对象
private Delegate delegate;
//现实set方法
public void setDelegate(Delegate delegate){
this.delegate = delegate;
}

//模拟回传方法函数
public void sendMessage(String clsName,String str){
System.out.println("AClass 收到 "+clsName+" 消息:"+str);
sendserver(clsName+"你好");
}
private void sendserver(String str){
//向接口方法中广播
delegate.data(this.getClass().getSimpleName(),str);
}
}

class BClass implements Delegate//实现delegate 接口
{
AClass aClass;
public BClass(){
aClass = new AClass();//初始化Aclass
//注册、建立接口关系
//与oc中的 委托方.Delegate = self ;吧 必须建立关系
aClass.setDelegate(this);
}

public void sendA(){
aClass.sendMessage(this.getClass().getSimpleName(),
aClass.getClass().getSimpleName()+"你好");//模拟控制A 通信
}
//实现接口方法 ,接受传递过来的内容
public void data(String clsName,String str){
System.out.println("BClass 收到 "+clsName+" 消息:"+str);
}
}


class Main{

public static void main(String[] s){
//初始化BClass 并触发发送内容
new BClass().sendA();
}
}

运行main方法打印出的日志如下:

IOS 界面传值实现的6种方式(二)

下面介绍OC中代理的实现:

我们要实现A (代理方)接收 B(委托方) 首先需要在(B.h)委托方中创建一个协议,添加协议方法,然后定义一个持有协议的ID指针。

//  BViewController.h//  界面传值Demo//#import <UIKit/UIKit.h>//委托方@protocol DataDelegate <NSObject>//协议方法- (void)dataValue:(NSString *) str;- (void)setVlalue:(NSString*) str;@end@interface BViewController : UIViewController/**定义一个持有协议的ID指针*/@property (weak) id<DataDelegate>delegate;@end
1、在A中遵循协议,并实现协议方法

//  ViewController.m

//  界面传值Demo   A 界面

//


#import "ViewController.h"

#import "BViewController.h"


@interface ViewController ()<DataDelegate>

//准备在界面创建两个控件,一个输入文字,一个用来跳转

@property (strong,nonatomic) UIButton *button;

@property (strong,nonatomic) UITextField *textField;

@end


@implementation ViewController

//实现协议方法

-(void)dataValue:(NSString *)str{

    LogWarning(@"%@",str);

}


- (void)setVlalue:(NSString *)str {

    LogWarning(@"%@",str);

}


关键与B建立代理关系的关键代码:与java中的注册接口对象相似。

 aClass.setDelegate(this);

 //设置代理关系

     BViewController *BVC = [[BViewController alloc]init];

    BVC.delegate = self;

2、在B中使用下面代码与A通讯。

  [self.delegate dataValue:@"代理内容"];

运行A跳转到B,点击返回键A会收到B传递过来的消息。打印的日志如下:

IOS 界面传值实现的6种方式(二)

总之代理传值需要有代理方法的代理协议,委托方要指定持有代理对象ID指针,代理方必须遵守代理协议实现代理方法,并且与委托方建立通讯关系,五大关键步骤。

五、Block传值

IOS 界面传值实现的6种方式(二)

官方推荐使用方法,实现数据回传方法。相比代理来说,实现起来比较方便,无需定代理与遵循协议。

只需要在传值的界面声明一个block传值方法。B中头文件中,代码如下:

//声明一个block进行反向传值  @property(copy)void(^[block方法名])( [参数类型 *变量名(可写可不写)],[参数类型 变量名]....);

@property(copy)void(^block)(NSString*,int _int);

B中使用下面代码实现数据传输:

self.block(@"block value", 22);

 在A中我们在初始化B的时候实现Block --接收来自B传 来的数据:  

   

    BViewController *BVC = [[BViewController alloc]init];

    

    BVC.block = ^(NSString * string, int _int) {

        //接受B回传的数据

        NSLog(@"string = %@---int = %d",string,_int);

    };

运行结果输出:

[Info][ViewController.m:93] string = block value---int = 22


六、通知传值

IOS 界面传值实现的6种方式(二)

直接看代码:利用通知中心发送和接受消息。

A中:注册监听通知消息

 [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(notifyHandle:)name:@"notifyName" object: nil];

并实现接受消息方法:

//接收通知中心传递的消息

-(void)notifyHandle:(NSNotification*)notify{

    NSLog(@"%@", notify.userInfo);

     NSLog(@"%@", notify.userInfo[@"key1"]);

}


B中返回时向消息中发送一条消息:

//postNotificationName:(NSNotificationName)aName object:(nullable id)anObject userInfo:(nullable NSDictionary *)aUserInfo;

    [[NSNotificationCenter defaultCenter]postNotificationName:@"notifyName" object:nil

    userInfo:@{@"key":@1,@"key1":@"string value"}];


运行结果:

------------------------------------------------

[Info][ViewController.m:77] {

    key = 1;

    key1 = "string value";

}

[Info][ViewController.m:78] string value [fg; 

----------------------------------------------------------

    常见的传值方法就到此为止。当然界面传值的方法还有很多,比如利用导航控制器segue传值,第三方框架等等。总之用到的时候在一点点记录下来。

经验值 +50   : 小菜鸟