界面通信:界面传值
(1)从前往后传
--属性传值
//事例 将第一个界面中的lable的值传给第二个界面
//现在后一个界面中定义一个可选类型的字符串 来接受前一个界面传过来的值
class TwoViewController: UIViewController {
var textlabel:String? //定义一个可选字符串
var textflied:UITextField?
override func viewDidLoad() {
super.viewDidLoad()
textflied = UITextField(frame: CGRectMake(100, 100, 180, 40))
textflied?.borderStyle = .Line
textflied?.placeholder = "回传的值"
textflied?.text = textlabel //将字符串赋给textflied 的文本text
view.addSubview(textflied!)
}
//在第一个界面中进行传值步骤
class ViewController: UIViewController {
var label:UILabel?
override func viewDidLoad() {
super.viewDidLoad()
label = UILabel(frame: CGRectMake(60, 100, 80, 40))
label?.text = "传值" //给label给一个值
let btn = UIButton(frame: CGRectMake(100, 140, 120,40))
btn.setTitle("传值", forState: UIControlState.Normal)
btn.setTitleColor(UIColor.redColor(), forState: UIControlState.Normal)
btn.backgroundColor = UIColor.yellowColor()
btn.addTarget(self, action: "btnAc", forControlEvents: UIControlEvents.TouchUpInside)
view.addSubview(label!)
view.addSubview(btn)
}
func btnAc(){
let twovc = TwoViewController() //实例化 创建一个第二界面的实例
twovc.textlabel = label?.text //label的文本赋值给 在第二界面中定义的字符串
navigationController?.pushViewController(twovc, animated: true)
}
(2)从后往前传
--<1>代理传值
在第二个界面中定义一个协议
protocol TwoProtocol {
func translateString(Str:String)
}
在第一界面中实现代理方法 将方法中的变量赋给Lable
实现代理,代理自己
在第二界面中
先创建一个代理
var delegate:TwoProtocol?
func btnAc(){
navigationController?.popViewControllerAnimated(true)
delegate?.translateString((textflied?.text)!)
}
在返回方法中调用这个代理--<2>closure(闭包)传值 (闭包传值我觉得是比代理传值要简单一些和更好用一些)
闭包传值跟代理传值的理念是一样的 并没有过大的区别
现在第二个界面中定义一个闭包
//定义闭包
/*
let/var 闭包名={
()->返回类型
in
}
*/
//用来将该页面的文本框内容赋值到前一个页面的label
var clousure:((str:String)->Void)?
在跳转函数中使用闭包
在第一个界面中实现这个闭包
func firstbtn(){
let senvc = SecondViewController()
navigationController?.pushViewController(senvc, animated: true)
senvc.clousure = {
(str:String)->Void
in
self.lab?.text = str
}
}