iOS开发过程中涉及到最多的一个地方就是页面传值问题,值从A页面到B页面,然后从B页面到A页面。从而保证整个程序的连贯性和实时性。
目前iOS页面间传值方案有如下方式:
1.属性传值 2.委托delegate传值 3.通知notification传值 4.block传值 5.kvo传值 6.userDefault传值 7.文件传值 8.单例模式传值 9.数据库传值
1.属性传值:A页面设置属性 NSString *paramString,在跳转B页面的时候初始化paramString。
//A页面.h文件
@property (nonatomic, copy)NSString *paramString;
//A页面.m文件
NextViewController *nextVC = [[NextViewController alloc] init];
nextVC.paramString = @"参数传质";
[self presentViewController:nextVC animated:YES completion:nil];
2.委托delegate传值:在B页面定义delegate,并且设置delegate属性,在A页面实现delegate协议
3.通知notification传值:在B页面中发送通知,在A页面注册观察者并且在不用的时候移除观察者。
//B页面发送通知
[[NSNotificationCenter defaultCenter] postNotificationName:@"ChangeNameNotification" object:self userInfo:@{@"name":self.nameTextField.text}];
[self dismissViewControllerAnimated:YES completion:nil];
//A页面注册观察者
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(ChangeNameNotification:) name:@"ChangeNameNotification" object:nil];
}
//观察到通知时候的处理方法
-(void)ChangeNameNotification:(NSNotification*)notification{
NSDictionary *nameDictionary = [notification userInfo];
self.nameLabel.text = [nameDictionary objectForKey:@"name"];
}
//通知不使用的时候移除观察者
[[NSNotificationCenter defaultCenter] removeObserver:self];
4.block传值:在B页面定义一个block类型的变量,在B页面跳转A的时候调用这个block。在A页面跳转到B页面的时候对B页面的block赋值。
//B页面定义block,并设置block类型的变量
typedef void (^ablock)(NSString *str);
@property (nonatomic, copy) ablock block;
//B页面跳转到A页面调用这个block
self.block(self.nameTextField.text);
[self dismissViewControllerAnimated:YES completion:nil];
//A页面跳转到B页面的时候对B页面的block赋值,这样在B页面跳转的时候就会回调这个block函数
[self presentViewController:second animated:YES completion:nil];
second.block = ^(NSString *str){
self.nameLabel.text = str;
};
5.kvo传值:在A页面设置B页面的变量second,并且对这个变量进行观察
- (void)addObserver:(NSObject * _Nonnull)anObserver forKeyPath:(NSString * _Nonnull)keyPath options:(NSKeyValueObservingOptions)options context:(void * _Nullable)context
并在A页面实现
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context方法。
在B页面对变量keyPath进行设置,在A页面都会观察的到。
@property (nonatomic, strong) SecondViewController *second;
//在A视图跳转到B视图的地方添加如下代码
self.second = [[SecondViewController alloc] initWithNibName:@"SecondViewController" bundle:nil];
[self.second addObserver:self forKeyPath:@"userName" options:NSKeyValueObservingOptionNew context:nil];
[self presentViewController:self.second animated:YES completion:nil];
//实现这个观察对象的方法
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
//在B页面对userName进行设置,在A页面都可以间听到
7.文件传值:保存到文件,从文件中读取
8.单例模式传值:通过全局的方式保存
9.数据库传值:保存到本地数据库,从数据库中读取。