prettyprint

2015年10月15日 星期四

以 Object Oriented 觀點看 2 個畫面如何傳遞參數


畫面切換,彼此間要傳遞參數這是常碰到的。在此我以物件導向 Object Oriented 的觀點,來看參數如何在 2 個畫面間傳遞。

既然是兩個畫面 View,每個UI 的 View 就會對應到一個 View Controller。所謂 "對應",就是 UI 的 View 會有屬性 ID 設定,指定這 View 屬於那一個類別 Class。

既然是類別,那就是談到 Code 的實作。Swift 大大改進 Objective-C,將類別的宣告 header file 與 類別的實作都放在同一個檔案 .swift 裏。

定義好 UI View 的類別,那 2 個 View 之間的變數又該如何傳遞 ? Apple 提供一個函式 prepardForSegue:sender , 即在前一個 View Controller 的類別中,我們呼叫此函式,將變數傳遞到下一個 View Controller。 

我們以一個範例來說明。

首先,我們會有兩個 View。 View 1 指定為 FirstViwController, View 2 指定為 SecondViewController。 這兩個類別都是繼承 UIViewController。 雖然它們的父類別 Parent Class 都繼承相同類別,但,由於 FirstViewController 與 SecondViewController 的"長相"不同,所以需設定 2 個不同的類別。這裡所謂"長相",即它們各自的屬性 Property 與能提供的功能 Function (或 Method) 都不相同,當然要設計成 2 個不同的類別。每個類別將 Property 與 Method 封裝 Encapsulate 起來,這是 Object Oriented 最基本的概念。

假設我們設定 FirstViewController 有屬性 senderVar 被宣告如下:


import UIKit
class FirstViewController:UIViewController {
   override fun viewDidLoad() {
      var senderVar:String = "test"
   }
   ...
}
而在 SecondViewController 有屬性 receiverVar 被宣告如下:

import UIKit
class SecondViewController:UIViewController {
     var receiverVar:String
     println("Receive Var : \(receiverVar)")
}
現在我們也知道 Apple 提供 prepardForSegue:sender 這函式,但,該如何使用呼叫 ? 同樣我們以 code 來說明。

import UIKit
class FirstViewController:UIViewController {
   override func prepareForSeque(seque:UIStoryboardSeque, sender:AnyObject!) { 
      var secondViewController = seque.destinationViewController as SecondViewController
      secondViewController.receiverVar = senderVar
   }
   ...
}
看到沒? 我們在第一個類別 FirstViewController 透過呼叫 prepardForSegue:sender 這函式, 宣告一個 SecondViewController 物件為 secondViewController,然後將 FirstViewController 的變數 senderVar 指定給 SecondViewController 的變數 receiverVar,而在第二個 View 顯示出來。 在 Object Oriented 的觀念裡,外人的物件 Object 是無法直接使用,必須透過物件才可。 後記: 知道這設計的概念,對以後類似不同類別間的呼叫就能得心上手。 Code 只是表面,但 Code 裡面所包含的觀念若很清楚,寫程式就相對輕鬆多了。例如: Object Oriented 的設計與語法必須熟練,畢竟現在無論是 UI 或 Code 的設計,其中心觀念都圍繞在 Object Oriented。

沒有留言:

張貼留言

prettyPrint();