2017-04-20 20 views
-1

私はモデルを持っています - 映画。 と2つのコントローラ - 最初に映画をタイトルで検索し、2番目に - ポスター、タイトル、年の表示結果を表示します。 今度は、私の3番目のコントローラでいくつかの履歴検索を作成する必要があります。 (searchHistoryController - TableView)ここではすべてのムービーが表示され、ムービーのタイトルでムービー情報が表示されます。 どうすればビルドできますか? 私のモデルに配列を作成しようとしました。それにresutlを書くのですが、検索を使うたびに配列を書き直し、新しい要素を追加することはありません。 たぶん分野 はいくつかの助けが必要使用:)検索履歴に要素を追加しますか?

Movie.swift

import Foundation 
import UIKit 
import Alamofire 
import AlamofireImage 


protocol MovieDelegate { 
    func updateMovieInfo() 
} 

class Movie { 
    private let omdbUrl = "http://www.omdbapi.com/?" 
    var title: String? 
    var filmYear: String? 
    var poster: String? 

    var delegete: MovieDelegate! 

    var historyMovie = [Movie]() 



    func getMovieInfo(title: String, completion: @escaping()->()){ 
     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): 
       let response = JSON as! NSDictionary 
       let status = response["Response"] as! String 
       if status == "True" { 
        self.title = (response["Title"] as! String) 
        self.filmYear = (response["Year"] as! String) 
        self.poster = (response["Year"] as! String) 
        // self.delegete.updateMovieInfo() 
        completion() 
       } else { 
        self.title = (response["Error"] as! String) 
        completion() 
       } 
      case .failure(let error): 
       print (error) 

      } 
     } 

    } 

} 

SearchVC

import UIKit 
class SearchViewController: UIViewController { 
    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!, completion: { 
       self.activityIndicator.stopAnimating() 
       self.performSegue(withIdentifier: "movieInfo", sender: self) 
      }) 
     } 
    } 

    override func viewDidLoad() { 
     super.viewDidLoad() 
    } 
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
     let secondVC = segue.destination as! DetailInfoViewController 
     secondVC.movieTitle = movie.title! 


    } 

} 

DetailVC

class DetailInfoViewController: UIViewController, MovieDelegate { 

    @IBAction func showHistory(_ sender: UIButton) { 
     performSegue(withIdentifier: "showHistory", sender: self) 
    } 
    @IBOutlet weak var posterImageView: UIImageView! 
    @IBOutlet weak var filmNameLabel: UILabel! 
    @IBOutlet weak var filmYearLabel: UILabel! 
    var movie = Movie() 
    var movieTitle = "" 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     self.movie.getMovieInfo(title: movieTitle) { 
      self.updateMovieInfo() 
     } 
     self.movie.delegete = self 
    } 

    func updateMovieInfo() { 
     getPoster(link: movie.poster) 
     filmNameLabel.text = movie.title 
     filmYearLabel.text = movie.filmYear 
    } 

    func getPoster(link: String?) { 
     if link != nil { 
      guard let url = URL(string: link!) else { return } 
      DispatchQueue.global().async { 
       if let data = try? Data(contentsOf: url) { 
        DispatchQueue.main.async { 
         self.posterImageView.image = UIImage(data: data) 
        } 
       } 
      }  } else { 
      self.posterImageView.image = #imageLiteral(resourceName: "Image") 
     } 

    } 
} 

答えて

0

まず、movieHistoryはMovieクラスの一部ではなく、SearchViewControllerクラスの一部であるべきです。 第2に、データを永続化しない限り、このためにレルムは必要ありません。

検索ボタンがタップされたら、SearchViewControllerのムービーを配列に保存して、それを別のView Controllerに送信してください。そう

また
@IBAction func searchButtonTapped(_ sender: UIButton) { 
     activityIndicator.startAnimating() 
     DispatchQueue.main.async { 
      self.movie.getMovieInfo(title: self.searchTextField.text!, completion: { 
       self.activityIndicator.stopAnimating() 
       movieHistory.append(movie) 
       self.performSegue(withIdentifier: "movieInfo", sender: movieHistory) 
      }) 
     } 
    } 

と同様に、(セグエのために:...)準備修正このような:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
     let secondVC = segue.destination as! DetailInfoViewController 
     secondVC.movieTitle = movie.title! 
     secondVC.movieHistory = movieHistory 
    } 

detailVCオーバーライドで準備:だけでなく(セグエのために...)とsearchHistoryControllerにmovieHistoryを送りますそれは以前のVCで行われたのと同じ方法です。

+0

thanx a lot !!!! – vo0ne

関連する問題