在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<NSKeyValueChangeKey,id> *)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];
}