当你在 A 页面点击按钮,弹出模态视图 B ,在模态视图上用户输入信息后,我们怎样才能把数据从模态视图 B 页面传到页面 A 呢?
这时,一个不错的方法是使用 delegate 和 protocol。我们可以使用系统的代理方法 (如 UITableViewDelegate、CLLocationManagerDelegate 所定义的方法),也可以自定义 protocol。
自定义 protocol 实现方法如下:
- 在页面 B 所在ViewController 开始处定义 protocol:
protocol ChangeCityDelegate {
func userEnteredANewCityName(city: String)
}
在 view controlller 内定义 delegate 变量:
class ChangeCityViewController: UIViewController {
var delegate : ChangeCityDelegate?
....
....
}
- 在页面 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
}
}
- 模态视图消失之前执行代理方法:
@IBAction func getWeatherPressed(_ sender: AnyObject) {
let cityName = changeCityTextField.text!
delegate?.userEnteredANewCityName(city: cityName)
self.dismiss(animated: true, completion: nil)
}
网友评论