iT邦幫忙

2018 iT 邦幫忙鐵人賽
DAY 6
1
Software Development

Swift 學習目標 -- 30 天送審第一支APP系列 第 6

DAY 6: 如何從一個 storyboard 傳送資料到另一個 storyboard

目前畫面上有兩個 storyboard ,分別是待會要接收資料的 Receiving storyboard,跟用來丟資料的 Sending storyboard。待會我們希望把使用 delegate 的方式,把輸入在左方 Sending storyboard 的 TextField 的內容,轉貼到左方的 Receiving storyboard 上。

https://ithelp.ithome.com.tw/upload/images/20171225/20107694j5TUMfPLMj.png

開一個新的 Swift file 給 Receiving storyboard。 創一個 protocol 名為 DataSentDelegate,

protocol DataSentDelegate {
    func userDidEnteredData(data: String)
    
}

給 Sending storyboard 的 TextField 一個命名為 dataTextField 的 @IBOutlet。並開一個 var delegateData 來儲存之後會被輸入的資料(of type optional),預設值為 nil。以免收到的為空值導致 error。

    @IBOutlet weak var dataTextField: UITextField!
    var delegateData: DataSentDelegate? = nil

也給下方的 UIButton 一個 @IBAction。當這個 UIButton 被按下去時,先在這個 func 裡面使用!(force unwrap)檢查 delegateData 及 dataTextField 是否不為 nil。在最後加入 Dismiss 方法,退出目前畫面並回到第一頁(Receiving storyboard)。

@IBAction func senderBtnWasPressed(_ sender: UIButton) {
        if delegateData != nil && dataTextField != nil {
                let data = dataTextField.text
                delegateData?.userDidEnteredData(data: data!)
            dismiss(animated: true, completion: nil)
        }
    }

(Tip: 假如要退出幕前畫面的話,記得要使用這個 dismiss func ,否則不會自動退出幕前的畫面唷!)

並回到 Receiving storyboard 的 ViewController 文件,把剛才檢查完的 data 內容(String) 更新到主畫面的 label 上。

    func userDidEnteredData(data: String) {
        receivingLabel.text = data
    }

不過我們忘記了一件事: 我們在一開始宣告儲存輸入資料的 var delegateData 時,將預設值設為 nil。而直到目前為止,我們的 delegateData 仍然沒有被更新,因此輸入的資料仍然沒有被更新到指定的 label。

我們可以在連接 Sending storyboard 與 Receiving storyboard 的 segue 實現這個目的。
首先,給這個 segue 一個 identifier : showSendingVC。 接下來, 使用 override func prepare ,並在這個 func 裡面,告訴 segue :資料的目的地是 sendingVC。

    override func prepare(for segue: UIStoryboardSegue, sender: AnyObject?) {
        if segue.identifier == "showSendingVC" {
            let sendingVC: SendingVC = segue.destination as! SendingVC
            sendingVC.delegateData = self
        }
    }

上一篇
如何使用 code 實現 Segue Action
下一篇
DAY 7: Segue 的使用
系列文
Swift 學習目標 -- 30 天送審第一支APP33
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言