提要:
起始视图 | ListTableViewController |
目标视图 | DetailViewController |
segue-identifier | toDetailView |
1.在故事板用拖拽法连接起始视图和目标视图,类型选“show”,并且设置segue的identifier。
2.正向传值:
利用函数,prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?)传值:
import UIKit
import Alamofire
import SwiftyJSON
class ListTableViewController: UITableViewController {
// 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?) {
//根据segue的identifier有目的地传值
if segue.identifier == "toDetailView" {
if let detailView: DetailViewController = segue.destinationViewController as? DetailViewController {
let data = self.noteList[self.index!]
detailView.noteTitle = data["title"] as? String
//这是反向传值,告诉编译器,DetailViewController的delegate在LisetTableViewContrliier实现
detailView.delegate = self
}
}
}
}
extension ListTableViewController: SendNoticeToListView {
//实现DetailViewController中的协议的函数
func sendNotice(sender: Bool) {
if sender {
print("我来自detailView")
}
}
}
import UIKit
import Alamofire
import SwiftyJSON
//定义反向传值的协议
protocol SendNoticeToListView{
func sendNotice(sender: Bool)
}
class DetailViewController: UIViewController, UITextFieldDelegate, UITextViewDelegate {
//用于接收传过来的正向传过来的值
var noteTitle: String?
var delegate: SendNoticeToListView?
override func viewDidLoad() {
super.viewDidLoad()
self.titleText.text = self.noteTitle
//设置返回按钮以及他触发的事件
let leftBarBtn = UIBarButtonItem(title: "返回", style: .Plain, target: self, action: #selector(backToList))
self.navigationItem.leftBarButtonItem = leftBarBtn
}
func backToList(){
if self.delegate != nil {
//实现给协议的函数传值
self.delegate?.sendNotice(true)
//弹栈返回ListTableViewController
self.navigationController?.popViewControllerAnimated(true)
}
}
}
总结:
正向传值:
1.拖拽法连接 起始视图和目标视图;
2.设置segue的identifier;
3.用prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?)函数传值。
反向传值:
1.在目标视图中:
1.1 定义用于反向传值的协议和协议中相应的函数;
1.2 定义delegate变量,它类型是1.1的协议名;
1.3 使用delegate,调用协议中的函数,给函数的参数列表添上要反向传递的值,不需要实现函数
2.在起始视图中:
2.1 继承协议
2.2 要告诉编译器 协议在起始视图中实现:slef.目标视图.delegate = self (根据实际情况写法不一)