界面传值最简单的方法是使用属性,但是在很多时候属性无法实现此功能,比如在导航视图控制器里面从后往前传值的时候,这个时候我们就需要使用,其他方法,例如代理,block,或者是通知.这里我们详细介绍代理的使用方法.
首先我们打开xcode,添加两个viewcontroller,使用导航视图控制器来管理,第一页添加一个UILabel,用来显示内容,第二页添加一个UITextfield,用来输入内容,效果如下
现在我们要实现的效果是在第二页的的textfield内容输入内容,然后在第一页的label里面显示.
首先我们要为第二页的viewcontroller声明一个协议,添加一个代理属性
代码如下
//代理遵守的协议方法
@protocol secondVCDelegate <NSObject>
-(void)passValue:(NSString *)string;
@end
@interface SecondViewController : UIViewController
@property (nonatomic,weak)id<secondVCDelegate>deleagte;//设置代理属性
@end
然后我们在推出第二个页面的时候要为第二个页面指定一个代理对象为self代码如下
-(void)next:(UIBarButtonItem *)sender{
SecondViewController *secondVC = [SecondViewController new];
secondVC.deleagte = self;
[self.navigationController pushViewController:secondVC animated:YES];
}
不要忘记要先声明代理方法
@interface ViewController ()<secondVCDelegate>
@end
然后去第一个页面实现代理方法,也就是把把代理传过来的之显示在label上面
-(void)passValue:(NSString *)string{
self.label.text = string;
}
在所有的贮备工作做好之后,我们就需要获取这个值,这里需要注意一点,就是在什么时候获取这个值.我们需要在第二个页面消失的时候的时候去获取这个值,并且用代理方法传过去.
-(void)back:(UIBarButtonItem *)sender{
NSString *string = _textfield.text;
[self.deleagte passValue:string];
[self.navigationController popToRootViewControllerAnimated:YES];
}
这样我们就实现用代理传值.