方法共有如下幾種畔柔,例子中會分別用到
一.通過segue進行傳值
二.通過delegate進行傳值
三.通過Notification進行傳值
四.通過回調(diào)函數(shù)進行傳值
需求:
我們經(jīng)常會使用navigationViewController捐下,使用segue拉拉線产阱,就可以實現(xiàn)頁面跳轉(zhuǎn)惕虑,使用prepareForSegue方便進行參數(shù)的正向傳遞庇忌,但我們也許也有的業(yè)務(wù)會是反向的傳遞參數(shù),這個時候需要使用delegate靠汁。
假設(shè)有兩個vc蜂大,事先做好了segue拉線,設(shè)置了按鈕啥的膀曾,然后可以直接正向跳轉(zhuǎn)县爬,以及因為在一個navigation里面所以,第二個vc有個默認(rèn)的back(發(fā)送并返回添谊,這里即“發(fā)送給A“按鈕)按鈕可以反向的跳轉(zhuǎn)财喳,第一個是avc,第二個是bvc斩狱, 在bvc中我們寫一個協(xié)議protocol耳高,當(dāng)然這個協(xié)議是寫在類外面的,只是和類在同一個swift文件中
AViewController.png
BViewController.png
通過segue和delegate正反向進行傳值
這個例子AViewController
通過 segue
傳值 BViewController
,BViewController
通過delegate
傳值 AViewController
//
// AViewController.swift
// SendParams_A2B_B2A
//
// Created by hongjunyao on 15/4/5.
// Copyright (c) 2015年 hongjunyao. All rights reserved.
//
import UIKit
class AViewController: UIViewController {
@IBOutlet weak var receiveLabel: UILabel!
@IBAction func sendBtnAction(sender: AnyObject) {
self.performSegueWithIdentifier("toBviewController", sender: nil)
}
@IBOutlet weak var textField: UITextField!
override func viewDidLoad() {
super.viewDidLoad()
}
// MARK: - Navigation
// In a storyboard-based application, you will often want to do a little preparation before navigation
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if(segue.identifier == "toBviewController"){
var bVc:BViewController = segue.destinationViewController as BViewController
bVc.tempString = textField.text
bVc.delegate = self
}
}
}
extension AViewController:SendMessageDelegate{
func sendWord(message: String) {
receiveLabel.text = message
}
}
//
// BViewController.swift
// SendParams_A2B_B2A
//
// Created by hongjunyao on 15/4/5.
// Copyright (c) 2015年 hongjunyao. All rights reserved.
//
import UIKit
protocol SendMessageDelegate{
func sendWord(message : String)
}
class BViewController: UIViewController {
@IBOutlet weak var receiveLabel: UILabel!
@IBAction func sendBtnAction(sender: AnyObject) {
if((delegate) != nil){
self.delegate?.sendWord(textField.text)
self.navigationController?.popViewControllerAnimated(true)
}
}
@IBOutlet weak var textField: UITextField!
var tempString:String?
var delegate : SendMessageDelegate?
override func viewDidLoad() {
super.viewDidLoad()
self.receiveLabel.text = tempString
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
}