在写OC界面时,我们经常会需要传值。
传值的两种方式
一 属性传值:从前到后的传值方式
属性传值是将需要的值从前面的界面传入到后面的界面的一种传值方式。
在进入下一界面时,下一界面的viewDidLoad还没有加载。所以我们可以在后一界面设置一个接受第一个界面传入的值的属性,而这个值时一个界面的属性。
示例:从界面First将一个字符串传到界面Second
//SecondViewController.h
@property (nonatomic,copy) NSString secondText;
//FirstViewController.h
@property (nonatomic,copy) NSString firstText;
//FirstViewController.m
SecondViewController *secondViewController = [[SecondViewController alloc] init];
secondViewController .secondText = firstText;
[self.navigationController pushViewController:secondViewController animated:YES];
二 协议传值:从后到前的传值方式
属性传值一般是将值从前传到后,这时的viewDidLoad还没有加载出来。但是有些时候我们需要从后向前传值。这时前一个界面的viewDidLoad已经加载过一次了。不会再重新加载,所以此时需用到协议传值。协议传值一共分为六步。
示例:从界面注册传到界面登陆
第一步:界面声明协议(写在界面注册)
//RegisterViewController.m
@protocol RegisterViewControllerDelegate<NSObject>
-(void) pushNameText:(NSString*) nameText;
-(void) pushPasswordText:(NSString*) passwordText;
@end
第二步:设置代理人(写在注册页面)
@property (nonatomic, assign) id<RegisterViewControllerDelegate>delegate;
第三步:在进入登陆界面时写
/*表示把要传的值让代理人先拿着*/
[self.delegate pushNameText:_nameTextFiled.text];
[self.delegate pushPasswordText:_passworddTextFiled.text];
/*从第二界面回到第一界面*/
[self dismissViewControllerAnimated:YES completion:nil];
第四步:登陆界面遵守协议(写在登陆界面)
@interface LoginViewController : UIViewController <RegisterViewControllerDelegate>
@property (nonatomic, strong) UITextField* nameTextField;
@property (nonatomic, strong) UITextField* passwordTextField;
@end
第五步:登陆界面接受传来的值(写在登陆界面)
-(void) pushNameText:(NSString *)nameText {
_strName = nameText;
}
-(void) pushPasswordText:(NSString *)passwordText {
_strPassword = passwordText;
}
第六步:指定注册界面的代理为登陆界面
RegisterViewController* registerViewController = [[RegisterViewController alloc] init];
registerViewController.delegate = self;
[self presentViewController:registerViewController animated:YES completion:nil];