天天看点

【iOS】—— 协议传值和属性传值协议传值属性传值

协议传值

协议:

协议是一个方法签名的列表,在其中可以定义若干个方法。根据配置,遵守该协议的类会去实现这个协议中规定的若干个方法。

代理:

代理是一个概念,很难用一个名词去定义(如我们可以说协议其实就是一个方法列表)。它更像是一种关系,我要做某一个事情,但我自己不想去做这件事,我委托其他人帮我去做这件事。这个时候,这位其他人就是我的代理。

代理模式是一种消息传递方式,一个完整的代理模式包括:委托对象、代理对象和协议。

  • 协议:用来指定代理双方可以做什么,必须做什么。
  • 代理对象:根据协议指定代理对象需要完成的事,即调用协议中的方法。
  • 代理对象:根据协议实现委托方需要完成的事,即实现协议中的方法。

代理传值:

第一步:在B控制器声明一份协议

//定义一个代理协议,B视图控制器的协议
@protocol VCSecondDelegate <NSObject>

//定义一个协议函数,改变A视图的背景颜色
- (void) changeColor:(UIColor*) color;

@end
           

第二步:在B视图中声明一个代理属性

//定义一个代理对象
//这个代理对象会执行协议函数
//通过代理对象来实现协议函数,达到代理对象改变本身属性的目的
//代理对象一定要实现代理协议
@property (assign, nonatomic) id<VCSecondDelegate> delegate;
           

第三步:在跳转回A视图的方法里写代理执行的方法

这里向视图B中添加了一个按钮,点击按钮触发按钮事件

//点击按钮时,触发按钮的事件
- (void) pressChange {
    //代理对象调用事件函数
    [_delegate changeColor:[UIColor purpleColor]];
}
           

第四步:在A视图控制器里签订代理协议

第五步:签订代理人

//点击屏幕空白处推出视图控制器B
- (void) touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
    VCsecond* vcSecond = [[VCsecond alloc] init];
    vcSecond.title = @"视图B";
    
    //将当前的控制器作为代理对象赋值
    vcSecond.delegate = self;
    
    //推出视图控制器B
    [self.navigationController pushViewController:vcSecond animated:YES];
}
           

第六步:实现代理方法

//通过代理的协议来改变背景颜色
- (void) changeColor:(UIColor *)color {
    self.view.backgroundColor = color;
}
           

以上就是基本的协议传值的方法,传递的参数可以随自己的需求而做相应的调整。

属性传值

正传是利用属性传值(例如,把第一个页面中TextFiled中的text传到第二个页面中的一个TextField的text中)。

  • 属性(property)是Objective-C的一项特性,用于封装对象中的数据。这一特性可以令编译器自动编写与属性相关的存取方法,并且保存为各种实例变量。

属性传值(从A视图传值到B视图中):

第一步:在B视图的 .h 文件中声明一个属性

利用这个NSString,可以将拿到的值赋给B中的Label、textfield等。

第二步:在A视图的 .h 文件中定义一个属性

第三步:在A视图的 .m 文件中进行给B视图的属性赋值并跳转控制器

- (void) press {
	SecondViewController *bViewController = [[SecondViewController alloc]init];
	bViewController.bText = aText;
	[self presentViewController:bViewController animated:YES completion:nil];
}
           

在哪里需要跳转控制器,就在哪里调用。

第四步:在B.m中拿到传过来的值,被根据需要使用,比如:

UITextField *accoutTextField = [[UITextField alloc] init];
accoutTextField.text = bText;