根據簡書上的幾位大咖整理并備注下,方便日后調用。
Hinsverson的文章:http://www.lxweimin.com/p/356e4329f562
航歌頁面segue跳轉:http://www.hangge.com/blog/cache/detail_720.html
一、Storyboard 上通過Cell直接拉線傳值,在 prepare(for segue: UIStoryboardSegue, sender: Any?)傳值
1)//Mark: - CustomCell.swift
struct CustomCell {
var title = ""
var finished:Bool = false
}
2)//Mark: - CustomTableViewController.swift
class CustomTableViewController: UITableViewController {
var customCells:[CustomCell] = [] //初始化數組
override func viewDidLoad() {
super.viewDidLoad()
loadData()
}
func loadData() {
for i in 0..<50 {
var c = CustomCell()
c.title = "CustomerCell \(i)"
c.finished = i % 2 == 0 ? true : false
customCells.append(c)
}
}
// MARK:- Storyboard之間通過Cell拉線
//? MARK: - 單個CELL的值在下面這個方法進行傳遞
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
self.navigationController?.setNavigationBarHidden(true, animated: false)
let destinationView = segue.destination as! GoalViewController
destinationView.customCell = self.customCells[(tableView.indexPathForSelectedRow?.row)!]
}
}
3)//Mark: - GoalViewController
class GoalViewController: UIViewController {
var customCell:CustomCell!? //只有一條數據,所以不是 [CustomCell],這個是從 CustomCell.swift的MODEL
@IBOutlet weak var showLabel: UILabel!
@IBAction func backButton(_ sender:Any){
navigationController?.popViewController(animated: true)
navigationController?.setNavigationBarHidden(false, animated:true)
}
override func viewDidLoad() {
super.viewDidLoad()
showLabel.text = customCell.title
}
}
二、在Storyboard利用 sender進行傳值,傳的值直接寫在 didSelectRowAt 方法
//簡書:? http://www.hangge.com/blog/cache/detail_720.html
var ctrlnames:[String] = ["任務1","任務2","任務3"]
var tableView:UITableView?
//返回表格行數(也就是返回控件數)
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return self.ctrlnames.count
}
//創建各單元顯示內容(創建參數indexPath指定的單元)
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath)
-> UITableViewCell {
//為了提供表格顯示性能,已創建完成的單元需重復使用
let identify:String = "cell1"
//同一形式的單元格重復使用,在聲明時已注冊
let cell = tableView.dequeueReusableCell(withIdentifier: identify,
for: indexPath) as UITableViewCell
cell.accessoryType = .disclosureIndicator
cell.textLabel?.text = self.ctrlnames[indexPath.row]
return cell
}
// UITableViewDelegate 方法,處理列表項的選中事件
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
self.tableView!.deselectRow(at: indexPath, animated: true)
let itemString = self.ctrlnames[indexPath.row]
self.performSegue(withIdentifier: "ShowDetailView", sender: itemString)
}
//在這個方法中給新頁面傳遞參數
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "ShowDetailView"{
let controller = segue.destination as! DetailViewController
controller.itemString = sender as? String
}
}
三、用StoryBoard連線跳轉實現傳值(分別為設置 segue連接的名字和story board id)
// 使用連接線的名稱
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if(segue.identifier == "segue跳轉名字")
let firstVC = segue.destinationViewController as FirstVC
firstVC.value = textField.text
}
//代碼跳傳到storyboard界面使用StoryBoard中視圖的Identifier (須設置 storyboard id )進行跳轉(? http://www.lxweimin.com/p/356e4329f562)
var firstVC = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier:”FirstViewController") as! FirstViewController
present(firstVC, animated: true, completion: nil)
//CVC為NewViewController的storyboard id
let vcView = UIStoryboard(name: "Main", bundle: nil)
.instantiateViewController(withIdentifier: "CVC")
self.present(vcView, animated: true, completion: nil)
//多個StoryBoard時 可以類比xib的實例對象獲取方式 let firstVC = FirstVC(nibName:"FirstVC",bundle: nil)
var storyboard = UIStoryboard(name: "New", bundle: nil)
var newVC = storyboard?.instantiateViewController(withIdentifier: "NewViewControllerID”) as! NewViewController
present(newVC, animated: true, completion: nil)
四、protocol Delegate 傳值(Story board Segue布局)
原理: ReceivingVC.swift 跳轉至 SendingVC.swift,SendingVC.swift輸入值,Receiving再接收值
//MARK: - ReceivingVC.swift
class ReceivingVC:ViewController,DataSentDelegate {
@IBOutlet weak var receivingLabel:UILabel!
// sendingVC.swift里的協議方法
func userDidEnterData(data: String) {
self.receivingLabel.text = data
}
/// Mark: - segue
if segue.identifier == “showSendingVC” {
let sendingVC:SendingVC = segue.destination as! SendingVC
sendingVC.delegate = self ////設置secondVC代理為自己
}
}
//MARK: - SendingVC.swift
protocol? DataSentDelegate(){ /// 定義協議
func userDidEnterData(data:String)
}
class SendingVC:UIViewController{
@IBOutlet weak var userTextField:UITextField!
var delegate:DataSentDelegate?
if delegate != nil {
delegate?.userDidEnterData(data: userTextField.text!)
dismiss(animated:true, completion:nil)
}
}
}
五、protocol Delegate 傳值(純代碼傳值)
系統命名協議的規則(類名+Delegate)
AVC.swift 視圖跳轉到-> BVC.swift (BVC輸入值,關閉視圖,返回AVC,AVC 獲得BVC輸入的值)
AVC .swift 首先繼承SecondVCDelegate協議
class ViewController: UIViewController,BVCDelegate {
func buttonAction2(){
let BVC = BVC(nibName:”BVC",bundle: nil)
//請BVC.SWIFT? 遵照 BVCDelegate()協義
BVC.delegate = self
present(BVC, animated: true, completion: nil)
}
func passOnInformation(value: String) {
//接收數據
self.textField.text = value
}
// BVC.swift 定義一個delegate
protocol BVCDelegate(){
// 自定義一個func
func passOnInformation(value:String)
}
在bVC類中添加代理屬性
var delegate:BVCDelegate?
func closeVC(){
//判斷代理是否為空
if (self.delegate != nil) {
//傳值
self.delegate?.passOnInformation(value: textField.text!)
}
self.dismiss(animated:true, completion: nil)
}
六、Mark: - 純代碼正向傳值 AVC.swift -> BVC.swift
AVC.swift
let goToVC = BVC()
goToVC.city = "處理傳值:\(indexPath.row)"
self.present(goToVC, animated: true, completion: nil)
BVC.swift
var city:String!
// nib形式
func buttonAction1(){
let firstVC = FirstVC(nibName:"FirstVC",bundle: nil)
firstVC.value = textField.text
presentViewController(firstVC, animated: true, completion: nil)
}