iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 29
0
自我挑戰組

iOS 新手開發的大小事系列 第 29

Day 29: 兩個 View Controllers 之間傳值 -1

  • 分享至 

  • twitterImage
  •  

前言

之前在試做一些小專案的時候,就遇到需要在兩個 view 之間傳值的問題,聽說方法很多種,但傳值有分正向傳值和逆向傳值,所謂的正向傳值就是指第一個 view 傳到第二個 view,而逆向傳值就是從第二個 view 傳回給第一個 view,可用於逆向傳值的方法就代表正向傳值也可以使用,但正向傳值就不一定可以使用於逆向傳值了,正向和逆向傳值得方法似乎很多種,但一時間也無法消化這麼多種的方法,所以這邊就將介紹一個正向和兩個逆向傳值的方式,今天先介紹正向傳值,逆向傳值就留到壓軸吧!

  • Use segue (正向傳值)
  • Protocol with delegate (逆向傳值)
  • Navigation Observation (逆向傳值)

正向傳值

昨天介紹了轉場的方法,有兩個方式就是利用 segue 的方式來實現轉場,可利用搭配 segue 的原生內建方法來達到傳值的效果。

先建立好兩個 views,並且在第一個 view 上建立一個 textfield 提供輸入文字,第二個 view 中,放一個 label,用來顯示第一個 view 中輸入的值,接著拉好 segue 並且將 identifier 命名為 "gotoSecondVC"

接著為第二個 view 建立一個新的 view controller

選 Cocoa Touch Class

Subclass of 記得選為 UIViewController

把剛建立好的檔案與 Storyboard 第二個畫面連結

最後把分別把兩個 views 中的 outlets 連結好後就在第一個 view controller 中利用方法 prepare(segue: sender:) 來設定傳值,原本很天真的直接呼叫目的地的變數來使用,結果直接 crash,實際程式碼如下:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == "gotoSecondVC" {
            if let destinationController = segue.destination as? SecondViewController {
                if let text = textField.text {      
                   destinationController.textLabel.text = text                    
                }
            }
        }
    }

在查找錯誤的時候,發現 destinationController.textLabel 會是 nil 值,代表此時 second view 中的物件還沒有生成,所以無法將值順利寫到 second view 的 label 中,解決的方式就是在 second view 中加入一個變數,並在 viewDidLoad() 的時候,把變數指定給 label 的 text,以下是程式碼:

In first view controller

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == "gotoSecondVC" {
            if let destinationController = segue.destination as? SecondViewController {
                if let text = textField.text {
                    // Can't directly use this object because it's not create yet
//                    destinationController.textLabel.text = text
                    destinationController.showText = text
                }
            }
        }
    }

In second view controller

var showText: String!

override func viewDidLoad() {
        super.viewDidLoad()
        textLabel.text = showText
    }

實際執行結果


上一篇
Day 28: 轉場到下一個 View
下一篇
Day 30: 兩個 View Controllers 之間傳值 -2
系列文
iOS 新手開發的大小事30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言