不同頁面間的資料傳值
不同的page,一般都會把程式碼分別寫在不同的swift檔案,但不同的檔案之間,並不認識彼此的參數,所以如何互相傳值,在APP開發裡,是很重要的一課!
不同頁面間的資料傳值有好幾種方式,這次的練習我用到了其中三種,以下簡單介紹一下用法:
- 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: