一、A页面传值给B界面:
采用的传值方式:属性传值,在A页面跳转B界面的地方直接给B界面的属性赋值即可。
二、A页面跳转到B界面,由B界面向A界面传值
采用的传值方式:delegate传值和通知传值
1.delegate传值
- 步骤一:由于B界面是委托方,所以将协议及方法需要写在B界面中
@protocol ViewControllerBDelegate
- (void)sendValue:(NSString *)value;
@end
- 步骤二:在B界面中设置代理(为了避免循环引用这里使用weak修饰)
@property (nonatomic,weak) id <ViewControllerBDelegate> delegate;
- 步骤三:从B界面传值
// B界面返回A界面的点击方法
- (void)buttonClick {
[self.delegate sendValue:self.textField.text];
[self.navigationController popViewControllerAnimated:YES];
}
- 步骤四:由于A界面是代理方,在A界面跳转到B界面的地方,设置界面B的代理为界面A
// 在A界面中点击按钮跳转到B界面,按钮的点击方法
- (void)buttonClick {
ViewControllerB *VC = [[ViewControllerB alloc] init];
VC.delegate = self;
[self.navigationController pushViewController:VC animated:YES];
}
- 步骤五:在界面A中实现代理方法
// 将B界面传过来的值显示在A界面的label上
- (void)sendValue:(NSString *)value {
self.label.text = value;
}
2.通知传值
由B界面向A界面传值,所以是B界面发送通知,A界面监听并接收通知
- 步骤一:B界面发送通知
// 在B界面返回A界面的点击事件中,发送了一个名称为test的通知,将B界面中textfield上输入的值传入
- (void)buttonClick {
NSNotificationCenter *center = [NSNotificationCenter defaultCenter];
[center postNotificationName:@"test" object:nil userInfo:[NSDictionary dictionaryWithObject:self.textField.text forKey:@"text"]];
[self.navigationController popViewControllerAnimated:YES];
}
- 步骤二:A界面监听并响应通知
// A界面监听名称为“test”的通知
NSNotificationCenter *center = [NSNotificationCenter defaultCenter];
[center addObserver:self selector:@selector(receiveNotification:) name:@"test" object:nil];
// 响应通知的方法,将传入的值显示在A界面的label上
- (void)receiveNotification:(NSNotification *)noti {
self.label.text = [noti.userInfo objectForKey:@"text"];
}
- 步骤三:不使用通知时,在A界面移除监听
- (void)dealloc {
[[NSNotificationCenter defaultCenter] removeObserver:self];
}
反向传值中还可以使用block和KVO等方式,后续更新~