iOS开发中经常需要在2个控制器之间传递数值,例如:aViewController上有一个label标签,bViewController有一个TextField等待用户输入,并且将用户输入的内容显示到aViewController中的label上,这中情况就是控制器之间的数值传递了,或者说数据通信。
实现的方式有很多种,本人主要实验了四种,一是delegate委托代理模式,二是notification通知,三是KVC模式,四是block回调,如果还有其他的欢迎指教,下面说明下这四种传值方式的实现。
1. delegate委托代理模式:
本质:bViewController没有修改aViewController种的label标签的能力,因此,需要委托aViewController去做,至于怎样子去做,那需要bViewController定义好做的方法(即protocol协议),然后委托aViewController按照这个方式去做。
核心代码实现:
第一步:bViewController发布协议,并设定delegate属性(在BViewController.h种声明)
.h文件中:
@ protocol BViewControllerDelegate<NSObject>
@optional
- (void)changeLabelText:(NSString *text);
@end
@interface BViewController : UIViewController
@property (nonatomic, assign) id<BViewControllerDelegate>delegate;
@property (nonatomic, strong) UITextField *textField;
@end
第二步:在视图消失时,让bViewController的代理调用协议方法去改变label值
.m文件中:
- (void)viewWillDisapper:(BOOL)animated
{
[self.delegate changeLabelText:_textField.text]; // 让代理去实现改变label值
}
第三步:在aViewController遵守协议,并实现协议方法改变label值
aViewController的.h文件中
@interface AViewController :UIViewController<BViewControllerDelegate>
@property (nonatomic, strong) UILabel *label;
@property (nonatomic, strong) BViewController * bVC;
@end
.m文件中: 实现协议方法
- (void)changeLabelText: (NSString *)text
{
_label.text = text;
}
同时别忘了将aViewController设置为bViewController的代理,因为自己写的时候比较容易忘记,特别提醒下,在推送画面时候设置:
bVC.delegate = self;
至此通过委托代理传值就已经实现了。
按照思路写Demo一般没什么问题,可以尝试下,其他方式明天继续写,睡觉。