iOS开发 两个视图之间值传递的常用方法<四>

四、视图之间传值方法——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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

moxi_wang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值