在程序代码编写过程中,避免不了传值的情况。传值分为两种,一种是正向传值,直接从A页面 push 到B页面,带数据和消息过去就可。那反向传值怎么操作?
一般常见的有代理,block,通知,单例...
1.代理,这是我个人最常用的 。
代理怎么实现反向传值,可以分为以下几个步骤:
第一步:定义协议(代理)
@protocol myDelegate <NSObject>
//这是协议方法
-(void)changeLabel:(NSString *)str;
@end
第二步:定义代理指针
@property(nonatomic,assign)id <myDelegate>delegate;
第三步:回调(如果不回调,是完成不了传值的)
if(self.delegate&&[self.delegaterespondsToSelector:@selector(changeLabel:)])
{
[self.delegatechangeLabel:_textF.text];
}
前三步都是在需要传值的类实现的,接下来的三个步骤是在需要接受类中实现的
第四步:继承协议
@interfaceViewController ()<myDelegate>
第五步:使用代理
vc.delegate=self;
第六步:实现协议方法
-(void)changeLabel:(NSString *)str
{
_label.text=str;
}
2.通知来实现
第一步:发通知(发消息) 在传值类中实现
[[NSNotificationCenter defaultCenter] postNotificationName:@"通知频道" object:nil userInfo:@{@"name":_textF.text}];
第二步:注册通知(接受消息) 在接受类中实现
[[NSNotificationCenterdefaultCenter] addObserver:self selector:@selector(labelText:) name:@"通知频道"object:nil];
第三步:实现方法
-(void)labelText:(NSNotification *)not
{
NSDictionary *dict = [not userInfo];
_label.text=dict[@"name"];
}
注意:通知要手动释放-(void)dealloc
{
[[NSNotificationCenterdefaultCenter]removeObserver:self];
}
获取当前程序的单例
AppDelegate *appdelegate = [UIApplication sharedApplication].delegate;
appdelegate.string = _textF.text;
_label.text = app.string;
4.block(代码块)
第一步:定义block变量
@property(nonatomic,copy)void (^myBlock) (NSString *);
返回值的类型 (^block的名称) (参数类型)
第二步 :回调
if(self.myBlock)
{
self.myBlock(_textF.text);
}
第三步:实现block
vc.myBlock = ^(NSString *str)
{
_label.text =str;
};