四、视图之间传值方法——KVO(健值观察者模式)
目的:将视图控制器2的textfield的内容传递到视图控制器1里面的lable显示。
思路1:让两个视图控制器都继承于一个BaseViewcontroller (自定义uiviewController的子类),这个视图控制器里面有两个属性 name old ,这样两个视图控制器都有name 和old 属性,那么在视图控制器1作为视图控制器2的观察者,监测到视图控制器2的属性变化之后 就把变化的值传给视图控制器1的lable。
思路2.思路1是我最开始想的 被我想复杂了,可以直接这样做,让两个视图控制器都继承UIviewcontroller ,给视图控制器2添加两个属性 name 和 old ,这样当pop的时候让两个属性分别对应textfield的内容,这样在视图控制器1也能观测到视图控制器2的属性的变化。
这里用思路一分析:
@interface BaseViewController : UIViewController
@property(nonatomic,copy)NSString *name;
@property(nonatomic,copy)NSString *old;
@end
视图控制器1:
.h文件
#import "BaseViewController.h"
@interface FirstController : BaseViewController
@property (weak, nonatomic) IBOutlet UILabel *naleLable;
@property (weak, nonatomic) IBOutlet UILabel *oldLable;
@end
.m文件:
@implementation FirstController
{
SecondController *vc;
}
//按钮响应事件
- (IBAction)buttonAction:(UIButton *)sender {
//跳转到视图控制器2 ,相当于push
[self performSegueWithIdentifier:@"push" sender:nil];
}
-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
vc = segue.destinationViewController;
//让视图控制器1作为视图控制器2的观察者,观察视图控制器2的两个属性 name old
[vc addObserver:self forKeyPath:@"name" options: NSKeyValueObservingOptionNew context:nil];
[vc addObserver:self forKeyPath:@"old" options:NSKeyValueObservingOptionNew context:nil];
}
//当监测到name old这两个属性有变化就会执行这个方法
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
if ([keyPath isEqualToString:@"name"]) {
_naleLable.text = change[@"new"];
//由于视图控制器2vc是在)prepareForSegue: 函数里面获得的 该函数在视图每次加载之前都会执行 这样每次返回视图控制器1的时候就会重复添加 观察者,因此在这里需要移除
[vc removeObserver:self forKeyPath:@"name"];
}
else if ([keyPath isEqualToString:@"old"])
{
_oldLable.text = change[@"new"];
[vc removeObserver:self forKeyPath:@"old"];
}
}
@end
视图控制器2:
.h文件
@interface SecondController : BaseViewController
@property (weak, nonatomic) IBOutlet UITextField *nameText;
@property (weak, nonatomic) IBOutlet UITextField *oldText;
@end
.m文件
@implementation SecondController
-(void)viewWillDisappear:(BOOL)animated
{
self.name = _nameText.text;
self.old = _oldText.text;
}
@end
源代码在我的资源里面可以免积分下载。下载地址:http://download.csdn.net/detail/moxi_wang/9040615