三种传值:属性传值 block传值 以及 代理传值 (这里我用前面的页面和后面的)来表示两个控制器:LoginViewController和RegisterViewController
建立两个控制器:LoginViewController(loginViewController)和RegisterViewController(registerViewController),
1.在LoginViewController上建立一个TextField(loginTextField)和一个UIButton(loginButton), loginTextField指向.h文件, 建立一个属性, loginButton指向registerViewController类型是show;
2.rregisterViewController中建立一个TextField(registerTextField) 两个button (blockButton, delegateButton), registerTextField指向.h文件, 建立一个属性, 两个button分别指向.m文件建立自己的方法sendValWithBlock和sendValWithDelegate;
1.属性传值
在registerViewController.h中定义一个value属性, 用来传值. 在LoginViewController中的prepareForSegue方法中的代码是
1 - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 2 { 3 RegisterViewController* registerVC = segue.destinationViewController; 4 5 // 1.属性传值 6 NSString* str = self.loginTextField.text; 7 if ([registerVC respondsToSelector:@selector(setValue:)]) { 8 [registerVC setValue:str forKey:@"value"]; 9 } 10 11 // 2.block传值 12 registerVC.sendValue = ^(NSString * obj){ 13 _loginTextField.text = obj; 14 }; 15 16 // 3.代理传值 17 registerVC.delegate = self; 18 19 20 } 21 #pragma mark 实现代理方法 22 - (void)sendValueWithDelegate:(id)id 23 { 24 self.loginTextField.text = id; 25 }
上面是三种传值方法的代码, 我们现在只看第一种, 我们初始化一个registerViewController对象, 来对他的value属性进行赋值, 然后再RegisterViewController中的registerTextField中显示他所传的值(这里我传的是loginTextField输入框里面的值)
然后我再registerViewController里面的viewdidload方法里面接收: _registerTextField.text = _value;
2.block传值
block传值的原理(个人见解):首先你要明白的是两个控制器的生命周期, 第一个页面也就是登陆页面, 他的生命周期是整个过程, 而登陆页面的生命周期是在我们点击第一个页面的登陆按钮开始, 到第二个页面退出结束的. 而我们把block有声明 实现和调用三个阶段, 我们把它的三个阶段分开了, 这是基于block一个特性:!!!!block的内部在实现的时候是不运行的, 只有在调用的时候才会运行. (没时间了)==吧