前景笔记:IOS 界面传值实现的6种方式(一)介绍了三种界面传值方法:属性传值、单例传值、NSUserDefaults传值。
根据下面的示意图,了解代理的原理,与java中的写法基本相同。
莫名的写了一下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方法打印出的日志如下:
下面介绍OC中代理的实现:
我们要实现A (代理方)接收 B(委托方) 首先需要在(B.h)委托方中创建一个协议,添加协议方法,然后定义一个持有协议的ID指针。
// BViewController.h
// 界面传值Demo
//
#import
//委托方
@protocol DataDelegate
//协议方法
- (void)dataValue:(NSString *) str;
- (void)setVlalue:(NSString*) str;
@end
@interface BViewController : UIViewController
/**定义一个持有协议的ID指针*/
@property (weak) iddelegate;
@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传递过来的消息。打印的日志如下:
总之代理传值需要有代理方法的代理协议,委托方要指定持有代理对象ID指针,代理方必须遵守代理协议,实现代理方法,并且与委托方建立通讯关系,五大关键步骤。
官方推荐使用方法,实现数据回传方法。相比代理来说,实现起来比较方便,无需定代理与遵循协议。
只需要在传值的界面声明一个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
六、通知传值
直接看代码:利用通知中心发送和接受消息。
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 : 小菜鸟