自定义 protocol 示例

2018-11-17  本文已影响99人  _浅墨_

当你在 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 下载

上一篇下一篇

猜你喜欢

热点阅读