swift 无法使用segue在视图控制器之间传递数据

lf5gs5x2  于 2023-02-21  发布在  Swift
关注(0)|答案(1)|浏览(107)

我正在尝试让我的应用程序调用API,基于用户搜索检索电影信息,然后使用segue将数据传递到下一个视图。在数据应该被传输过来之前,一切似乎都运行良好。我的两个视图控制器和我调用API的文件如下所示。

import UIKit

class ViewController: UIViewController {
    
    @IBOutlet weak var searchBar: UISearchBar!
    
    var movieManager = MovieManager()
    
    var movieTitle = ""
    var movieDescription = ""
    
    var results: [Results] = []
    
    override func viewDidLoad() {
        movieManager.delegate = self
        super.viewDidLoad()
        // Do any additional setup after loading the view.
    }
    
}
//MARK: - Movie Manager Methods

extension ViewController: MovieManagerDelegate {
    func didUpdateMovie(title: String?, description: String?, resultsList: [Results]?) {
        movieTitle = title!
        movieDescription = description!
        results = resultsList!
        
        print("\(movieTitle) \n \(movieDescription)")
        
        
    }
    
    func didFailWithError(error: Error) {
        print("error")
    }
    
}
//MARK: - Search Bar Methods
extension ViewController: UISearchBarDelegate {
    
    func searchBarSearchButtonClicked(_ searchBar: UISearchBar) {
        movieManager.searchMovie(for: searchBar.text!)
        searchBar.text = ""
        searchBar.resignFirstResponder()
        performSegue(withIdentifier: "goToResults", sender: self)
        
    }
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == "goToResults" {
            if let destinationVC = segue.destination as? ResultsListViewController {
                
                destinationVC.movieTitle = self.movieTitle
                
            }
        }
    }
    func searchBarShouldEndEditing(_ searchBar: UISearchBar) -> Bool {
        searchBar.resignFirstResponder()
        return true
    }
    
    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        self.view.endEditing(true)
    }
    
}

import UIKit

class ResultsListViewController: UIViewController {
    @IBOutlet weak var movieName: UILabel!
    var movieTitle: String = ""
    
    override func viewDidLoad() {
        super.viewDidLoad()
        movieName.text = movieTitle
        
    }
   
   
}import UIKit

class ResultsListViewController: UIViewController {
    @IBOutlet weak var movieName: UILabel!
    var movieTitle: String = ""
    
    override func viewDidLoad() {
        super.viewDidLoad()
        movieName.text = movieTitle
        
    }
   
   
}

import Foundation

protocol MovieManagerDelegate {
    func didUpdateMovie(title: String?, description: String?, resultsList: [Results]?)
    func didFailWithError(error: Error)
    
}
struct MovieManager {
    
    
    var movieTitle: String?
    var movieDescription: String?
    
    var results: [Results]?
    var delegate: MovieManagerDelegate?
    
    let baseURL = "https://imdb-api.com/en/API/SearchMovie/(APIKEYHERE)/"
    
    func searchMovie(for userSearch: String){
        let urlString = "\(baseURL)\(userSearch)"
        if let url = URL(string: urlString){
            
            let session = URLSession(configuration: .default)
            
            
            let task = session.dataTask(with: url) { data, response, error in
                if error != nil {
                    self.delegate?.didFailWithError(error: error!)
                    return
                }
                if let safeData = data {
                    
                    let movieInfo = self.parseJSON(safeData)
                    self.delegate?.didUpdateMovie(title: movieInfo.0!, description: movieInfo.1!, resultsList: movieInfo.2)
                }
            }
            task.resume()
        }
        
    }
    
    func parseJSON(_ data: Data) -> (String?, String?, [Results]) {
        let decoder = JSONDecoder()
        var movieTitle = "", movieDescription = "", searchResults: [Results] = []
        do {
            if let decodedData = try decoder.decode(MovieData?.self, from: data) {
                
                movieTitle = decodedData.results.first!.title
                movieDescription = decodedData.results.first!.description
                searchResults = decodedData.results
                //                print("\(movieTitle) \n \(movieDescription)")
            }
            
            return (movieTitle, movieDescription, searchResults)
        } catch {
            print(error)
            
        }
        return (movieTitle, movieDescription, searchResults)
    }
}
t8e9dugd

t8e9dugd1#

问题是在API结果之前转到下一个控制器。
尝试在API结果后继续

func searchBarSearchButtonClicked(_ searchBar: UISearchBar) {
        movieManager.searchMovie(for: searchBar.text!)
        searchBar.text = ""
        searchBar.resignFirstResponder()
       //Segue to next controller before the result of API
        performSegue(withIdentifier: "goToResults", sender: self)
        
    }

因此,您将在parseJSON或didUpdate委托的结果之后继续下一个控制器

相关问题