最简单的AB面正向传值
应用场景
登录获取账号,昵称
实现方法
设置第一个界面
首先在第一个界面创建好一个TextFeild,用来获取我们要传的文字
import UIKit
class ViewController: UIViewController {
let textField = UITextField()
override func viewDidLoad() {
super.viewDidLoad()
self.view.backgroundColor = UIColor.whiteColor()
textField.frame = CGRectMake(7, 100, 400, 50)
textField.borderStyle = .RoundedRect
self.view.addSubview(textField)
}
}
在SubViewController里设置一个公开的属性去接收数据
var string: String?
在ViewController里设置点击屏幕时传值
//当点击屏幕时执行该方法
override func touchesBegan(touches: Set, withEvent event: UIEvent?) {
//MARK:创建第二个界面的对象
let svc = SubViewController()
//MARK:通过属性来进行正向传值
svc.string = self.textField.text
//跳转到第二个界面
self.presentViewController(svc, animated: true, completion: nil)
}
在第二个界面里创建好一个label用来接收值
//控件不公开
private let textLabel = UILabel()
override func viewDidLoad() {
super.viewDidLoad()
self.view.backgroundColor = UIColor.cyanColor()
textLabel.frame = CGRectMake(7, 200, 400, 50)
textLabel.textAlignment = .Center
self.view.addSubview(textLabel)
在视图将要显示的时候将传进来的值赋值给控件
override func viewWillAppear(animated: Bool) {
super.viewWillAppear(animated)
//在视图将要显示的时候,去将传进来的值,赋给控件
self.textLabel.text = string
}
当点击屏幕时,返回第一个界面
override func touchesBegan(touches: Set, withEvent event: UIEvent?) {
//返回上一页面
self.dismissViewControllerAnimated(true, completion: nil)
}
利用属性进行AB页面的反向传值
应用场景
将在第二个设置好的数据返回给第一个页面
优点
简单,代码量少,易理解
实现方法
在SubViewController里定义一个属性,去接收返回值的目标对象,然后放置一个UISwitch,设置开关的相应方法
var vc: ViewController?
//设置开关的响应方法
func swAction(sw:UISwitch){
//判断状态
if sw.on {
//MARK:此步骤实现反向传值,将状态值回传给A页面
self.vc?.lsStatusLabel.text = "ON"
}else{
self.vc?.lsStatusLabel.text = "OFF"
}
}
在ViewController里面设置touchBegan方法
override func touchesBegan(touches: Set, withEvent event: UIEvent?) {
//MARK:实例化一个第二个界面的对象
let svc = SubViewController()
//给B页面传值,告诉B回传数据的目标是谁
svc.vc = self
//点击屏幕时跳转到第二个界面
self.presentViewController(svc, animated: true, completion: nil)
}
代理委托实现页面之间的反向传值
可以参考我写的另一篇文章
https://blog.csdn.net/weixin_39655956/article/details/81086758
使用TargetAction实现传值
这种传值方式和使用代理传值有相似之处,大致的思想就是在有数据的界面进行传值开始的指令,在接收数据的界面完成实质的传值操作
应用场景
登录获取账号,昵称
实现方法
在SubViewController中我们设置两个属性:target和action
//设置两个属性接收传值目标和方法
//用来去接收传值的目标是任意目标
var target: AnyObject?
//用来去接收传值的方法
var action: Selector?
在SubViewController中,当点击屏幕时发送传值指令
override func touchesBegan(touches: Set, withEvent event: UIEvent?) {
//B页面根部不需要考虑传值的目标和方法具体是谁,直接去调用自己的属性即可
//MARK:这种方式称为回调,让目标调用目标方法,参数为我传入的TextField的值
self.target?.performSelector(self.action!, withObject: self.tf.text )
self.dismissViewController
在ViewController中我们要给SubViewController指定是指真正的target,真正的 action是什么。
同样。我们设置当点击屏幕时,将这些信息告诉给SubVIewController,显然,target是ViewController,action则是我们指定的某个实现方法
那么,我们首先要设定一个用来回传数据的方法
//定义一个用来去回传数据的方法
func backValue(string:String) {
//通过传进来的参数,给label赋值
textLabel.text = string
}
然后将target和action告诉SubViewController
override func touchesBegan(touches: Set, withEvent event: UIEvent?) {
//获取SubViewController
let svc = SubViewController()
//通过正向传值,来告诉B页面回调时需要用到的参数
svc.target = self
//MARK:将action告诉SubViewController
//NSSelectorFromString 方法是将一个字符串方法转换成真正的方法名
svc.action = NSSelectorFromString("backValue:")
self.presentViewController(svc, animated: true, completion: nil)
}
到此为止,当点击ViewController屏幕时,将taget和action告诉了第二个界面,在第二个界面点击屏幕时,执行了target action命令,实现了backValue方法,完成了完整的传值操作
个人使用时遇到的问题及注意事项
在使用的时候,一般都结合storyBoard使用,这样我们声明的viewController可能就不是我们想要的与storyBoard绑定的viewController。可以尝试这样绑定声明
let secondView = self.storyboard?.instantiateViewController(withIdentifier: "second") as! addTagsViewController
参考资料
https://blog.csdn.net/zhonggaorong/article/details/52953793