iOS页面间传值详解(二)

在iOS页面间传值详解(一)中,介绍了iOS界面间的正向传值以及逆向传值的两种方法,其实逆向传值还可以使用block和KVO等方式,下面介绍这两种传值方式。

情景回顾

有两个界面,ViewControllerA和ViewControllerB,在ViewControllerA中有一个label和跳转到B界面的一个按钮,在ViewControllerB中有一个textField和返回A界面的按钮,需要将B界面中textField上属于的值显示在A界面的label上。

1.block逆向传值
  • 步骤一:B界面定义一个block并声明一个属性
typedef void (^valueBlock) (NSString *strValue);
// 声明属性
@property (nonatomic, copy) valueBlock valueBlock;
  • 步骤二:在B界面返回A界面的地方,把需要返回的值给block的参数
- (void)buttonClick {
    __weak typeof(self) weakSelf = self;
    if (weakSelf.valueBlock) {
        weakSelf.valueBlock(weakSelf.textField.text);
    }
    [self.navigationController popViewControllerAnimated:YES];
}
  • 步骤三:在A界面回调block
- (void)buttonClick {
    ViewControllerB *VC = [[ViewControllerB alloc] init];
    VC.valueBlock = ^(NSString *strValue) {
        self.label.text = strValue;
    };
    [self.navigationController pushViewController:VC animated:YES];
}
2.KVO方式传值
  • 步骤一:在A界面中定义属性并在A界面跳转B界面的方法中添加观察者
// 添加属性
@property (nonatomic, strong) ViewControllerB *viewControllerB;

- (void)buttonClick {
    self.viewControllerB = [[ViewControllerB alloc] init];
    [self.viewControllerB addObserver:self forKeyPath:@"text" options:NSKeyValueObservingOptionNew context:nil];
    [self.navigationController pushViewController:self.viewControllerB animated:YES];
}
  • 步骤二:在A界面中实现监听对应Key值变化的方法
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
    if ([keyPath isEqualToString:@"text"]) {
        self.label.text = self.viewControllerB.text;
    }
}
  • 步骤三:在B界面返回A界面的方法中,将值赋给对应的属性
// 在.h文件中设置对应的属性
@property (nonatomic, strong) NSString *text;
// 赋值
- (void)buttonClick {
    self.text = self.textField.text;
    [self.navigationController popViewControllerAnimated:YES];
}

你可能感兴趣的:(iOS页面间传值详解(二))