我有两个控制器 SearchViewController 和 DetailInfoViewController 首先有textField和submit按钮,第二个 - 两个标签
在textField中我写电影片名,当我按下提交我的模型(Movie.swift)在服务器上发送请求并获得电影信息的响应。 我如何在 DetailInfoViewController 上发送此响应?
Movie.swift
class Movie {
let omdbUrl = "http://www.omdbapi.com/?"
var title: String?
var filmYear: String?
var poster: String?
var delegete: MovieDelegate!
func getMovieInfo(title: String){
let params = ["t": title]
Alamofire.request(omdbUrl, method: .get, parameters: params).validate(statusCode: 200..<300).validate(contentType: ["application/json"]).responseJSON { (response) in
switch response.result {
case .success(let JSON):
print(response.response!.statusCode)
print(response.result.description)
print("validation successful")
let response = JSON as! NSDictionary
print(response)
let status = response["Response"] as! String
if status == "True" {
self.title = (response["Title"] as! String)
self.filmYear = (response["Year"] as! String)
self.poster = (response["Poster"] as! String)
self.delegete.updateMovieInfo()
} else {
print (response["Error"]!)
}
case .failure(let error):
print (error)
}
}
}
}
class SearchViewController: UIViewController, MovieDelegate {
var movie = Movie()
@IBOutlet weak var activityIndicator: UIActivityIndicatorView!
@IBOutlet weak var searchTextField: UITextField!
@IBOutlet weak var searchButton: UIButton!
@IBAction func searchButtonTapped(_ sender: UIButton) {
activityIndicator.startAnimating()
DispatchQueue.main.async {
self.movie.getMovieInfo(title: self.searchTextField.text!)
self.activityIndicator.stopAnimating()
}
if self.activityIndicator.isHidden {
self.performSegue(withIdentifier: "movieInfo", sender: self)
}
}
func updateMovieInfo() {
print(movie.title!)
print(movie.filmYear!)
print(movie.poster!)
}
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
}
//MARKL: Delegate
}
class DetailInfoViewController: UIViewController, MovieDelegate {
@IBOutlet weak var posterImageView: UIImageView!
@IBOutlet weak var filmNameLabel: UILabel!
@IBOutlet weak var filmYearLabel: UILabel!
var movie = Movie()
override func viewDidLoad() {
super.viewDidLoad()
self.movie.delegete = self
filmNameLabel.text = self.movie.title
filmYearLabel.text = self.movie.filmYear
updateMovieInfo()
}
// MARK: - Navigation
func updateMovieInfo() {
print(movie.title!)
print(movie.filmYear!)
print(movie.poster!)
}
}
答案 0 :(得分:0)
您需要一个完成处理程序。像这样的东西,
func getMovieInfo(title: String, completion: ()->(){
let params = ["t": title]
Alamofire.request(omdbUrl, method: .get, parameters: params).validate(statusCode: 200..<300).validate(contentType: ["application/json"]).responseJSON { (response) in
switch response.result {
case .success(let JSON):
print(response.response!.statusCode)
print(response.result.description)
print("validation successful")
let response = JSON as! NSDictionary
print(response)
let status = response["Response"] as! String
if status == "True" {
self.title = (response["Title"] as! String)
self.filmYear = (response["Year"] as! String)
self.poster = (response["Poster"] as! String)
self.delegete.updateMovieInfo()
completion()
} else {
print (response["Error"]!)
}
case .failure(let error):
print (error)
}
}
}
}
DispatchQueue.main.async {
self.movie.getMovieInfo(title: self.searchTextField.text!) {
self.activityIndicator.stopAnimating()
self.performSegue(withIdentifier: "movieInfo", sender: self)
}
}