不同頁面間的資料傳值

debbie tseng
5 min readNov 12, 2016

--

不同的page,一般都會把程式碼分別寫在不同的swift檔案,但不同的檔案之間,並不認識彼此的參數,所以如何互相傳值,在APP開發裡,是很重要的一課!

不同頁面間的資料傳值有好幾種方式,這次的練習我用到了其中三種,以下簡單介紹一下用法:

  1. performSegue

這個做法,首先在Storyboard 要有一條ViewController to ViewController的連線(Segue),並將Segue命名

↘第一頁的程式碼

@IBAction func goDetail(_ sender: UIButton) {   self.performSegue(withIdentifier: “goDetail”, sender: sender.tag)}override func prepare(for segue: UIStoryboardSegue, sender: Any?) {   let tag = sender as! Int   let controller = segue.destination as! movie   controller.movieDetail = movieArray[tag]}

當按下畫面上3個Button 其中一個時,觸發func goDetail,會把sender 的值傳到prepare,prepare 會接下sender 的值,處理過再把參數傳到第二頁的。

其中movie是第二頁的class名稱,這邊把controller做轉型,程式才會認得第二頁宣告的參數movieDetail。

↘然後第二頁只要宣告一個movieDetail就可以把值接收,再做後續處理了。

var movieDetail = MovieDetail()

2. 從Button 到下一頁的ViewController 連線(Segue)

↘第一頁程式碼:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {   let controller = segue.destination as! EditMovie   controller.editMovie = movieDetail}

這個方式,如果有多個button 都要可以傳值到下一頁,就必須每個Button 都要拉一條Segue。sender 會是UIButton 的型別,因為我的程式不需要用到,所以沒有多做處理。

↘然後第二頁只要宣告一個editMovie就可以把值接收,再做後續處理了。

var editMovie = MovieDetail()

3. 利用通知傳值

這個方式有點像是在寄信的感覺,不拘泥於只能把值傳到下一頁,主要分成發送方跟接收方。

在發送方,我自訂了一個通知,命名為GetUpdateNoti,editMovie是我要發送出去的資訊。

接收方可以有不只一個,想接到值的每一頁都可以寫接收方的程式。只要在viewDidLoad 做一次接收通知的設定,當每次收到通知的時候,就會執行getUpdateNoti(noti:)這個function,所以在裡面接收傳過來的值。

↘發送方:

let notificationName = Notification.Name("GetUpdateNoti")
NotificationCenter.default.post(name: notificationName, object: nil, userInfo: [“PASS”:editMovie])

↘接收方:

override func viewDidLoad() {super.viewDidLoad()   let notificationName = Notification.Name(“GetUpdateNoti”)   NotificationCenter.default.addObserver(self, selector: #selector(getUpdateNoti(noti:)), name: notificationName, object: nil)}func getUpdateNoti(noti:Notification) {   movieDetail = noti.userInfo!["PASS"] as! MovieDetail}

※最後,不同頁面間傳值有個地方要注意的就是,不能直接用新頁面的IBOutlet 來接值,因為舊頁面在傳值的當下,新頁面IBOutlet 的連結還沒生成,所以程式會有錯。

↘最後跑出來的結果:

↘GITHUB:

--

--