自定義 protocol 示例

當你在 A 頁面點擊按鈕,彈出模態視圖 B ,在模態視圖上用戶輸入信息後,我們怎樣才能把數據從模態視圖 B 頁面傳到頁面 A 呢?

這時,一個不錯的方法是使用 delegate 和 protocol。我們可以使用系統的代理方法 (如 UITableViewDelegate、CLLocationManagerDelegate 所定義的方法),也可以自定義 protocol。

自定義 protocol 實現方法如下:

  1. 在頁面 B 所在ViewController 開始處定義 protocol:
protocol ChangeCityDelegate {
    func userEnteredANewCityName(city: String)
}

在 view controlller 內定義 delegate 變量:

class ChangeCityViewController: UIViewController {
    
    var delegate : ChangeCityDelegate?
    ....
    ....
}
  1. 在頁面 A 所在 view controller 實現 B 定義的 ChangeCityDelegate protocol
class WeatherViewController: UIViewController, CLLocationManagerDelegate, ChangeCityDelegate {

實現 protocol 定義的方法:

 func userEnteredANewCityName(city: String) {
        
        let params : [String : String] = ["q" : city, "appid" : APP_ID]
        
        getWeatherData(url: WEATHER_URL, parameters: params)
        
    }

當執行點擊事件進入頁面 B 時,對 delegate 賦值 :

 override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == "changeCityName" {
            let destinationVC = segue.destination as! ChangeCityViewController
            destinationVC.delegate = self // 設置 頁面 B 的代理爲頁面 A controller 
        }
    }
  1. 模態視圖消失之前執行代理方法:
 @IBAction func getWeatherPressed(_ sender: AnyObject) {

        let cityName = changeCityTextField.text!
        
        delegate?.userEnteredANewCityName(city: cityName)

        self.dismiss(animated: true, completion: nil)
        
    }

demo 下載

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章