协议传值
协议传值作为一个反向的传值方式,在界面之间的用途十分广泛,简单用法大致为,从a界面切换到b界面,此时在b界面设置协议和代理,通过代理将所需要的值传回a界面,a界面的视图控制器需要遵守b界面的协议,从而去实现协议函数,在函数中的参数,就是从b界面所传回来的值。
我们来看代码实现
首先在第二个界面设置协议和代理:
//定义代理协议
@protocol VCSecondDelegate <NSObject>
//定义一个协议函数改变背景颜色
- (void)changeColor: (UIColor *)color;
@end
@interface VCSecond : ViewController
//定义一个代理对象
//代理对象执行协议函数
//通过代理对象实现协议函数,达到代理对象改变本身属性的目的
//代理对象一定要实现代理协议
@property (assign, nonatomic) id<VCSecondDelegate> delegate;
@end
在第一个界面,视图控制器的类遵守该协议
@interface VCFirst : ViewController <VCSecondDelegate>
- (void)changeColor:(UIColor *)color;
@end
在第一个界面里让第二个界面显示
//推出视图控制器2
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
VCSecond *vc2 = [[VCSecond alloc] init];
//将当前的控制器做为代理对象赋值
vc2.delegate = self;
[self.navigationController pushViewController:vc2 animated:YES];
}
在第二个界面对代理对象赋值:
//点击按钮时,触发代理的事件
- (void)pressChange {
[_delegate changeColor: [UIColor redColor]];
}
此时第一个界面所需要的第二个界面的值已经传到了第一个界面,我们在第一个界面完成该协议函数,就可以得到这个值,然后对该值去做相应的处理即可:
- (void)changeColor:(UIColor *)color{
self.view.backgroundColor = color;
}
协议传值主要应用是一个反向传值,类似于更换头像,和登录注册等情况下使用。
属性传值
属性传值和协议传值最重要的一点不同,属性传值是在从a界面切换到b界面的时候直接将值传过去,对b界面的属性进行赋值,此时通过a界面所切换过来的b界面的属性就有其该有的值。
首先在b界面设置属性:
@interface SecondViewController : ViewController
@property (nonatomic, strong) UIColor *newcolor;
@end
然后在a界面将b界面显示出来,并且在这里对属性赋值:
//推出视图控制器2
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
SecondViewController *secondViewController = [[SecondViewController alloc] init];
//对属性进行赋值
secondViewController.newcolor = [UIColor orangeColor];
[self.navigationController pushViewController:secondViewController animated:YES];
}
此时的b界面newcolor属性就有了值。
self.view.backgroundColor = _newcolor;