ios - 将数据传递到tableViewController时出错

标签 ios swift realm

我有个问题。我正在制作一个使用来自themoviedb的API并将电影保存在Realm中的应用。在主屏幕上,我正在使用CollectionViewController,当我触摸电影时,它将转到详细信息。但是,当谈到细节时,什么也没出现,当我选择另一部电影时,它带来了上一部电影。

家:

import UIKit
import RealmSwift

class HomeViewController: UIViewController,UICollectionViewDataSource, UICollectionViewDelegate, UICollectionViewDelegateFlowLayout, UISearchBarDelegate {


    @IBOutlet weak var searchbar: UISearchBar!
    @IBOutlet weak var ListOfMovies: UICollectionView!


    var movies : Results<Moviess>!
    let realm = try! Realm()
    var detailsMovies = Moviess()

    override func viewDidLoad() {
        super.viewDidLoad()
        print(Realm.Configuration.defaultConfiguration.fileURL!)
        ListOfMovies.delegate = self
        ListOfMovies.dataSource = self
        searchbar.delegate = self
        movies = realm.objects(Moviess.self)
        getRequest()
    }

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)

    }

    func getObjects(filter: String) -> Results<Moviess>{
        movies = realm.objects(Moviess.self).filter("title CONTAINS[cd] %@",filter)
        return movies
    }


    func getRequest(){
        print(movies.count)
        if movies.count < 1 {
            RequestData.requisicao { (result) in
                   switch(result){
                   case .success(let detalhe):
                    self.ListOfMovies.reloadData()
                   print(detalhe)
                   case .failure(let error):
                       print(error)
                   }
               }
        }}

    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return movies.count
      }

      func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "listOfMovies", for: indexPath) as! HomeCollectionViewCell
        let infos = movies[indexPath.item]
        cell.configurationMovie(movie: infos)
        return cell
      }
    func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
        detailsMovies = movies[indexPath.row]
    }


      func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
          return UIDevice.current.userInterfaceIdiom == .phone ? CGSize(width: collectionView.bounds.width/2-20, height: 200) : CGSize(width: collectionView.bounds.width/3-20, height: 250)
      }

    func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
        print(searchText)
        if !searchText.isEmpty{
            let filtro = getObjects(filter: searchText)
            print(filtro)
            ListOfMovies.reloadData()
        }else{
            movies = realm.objects(Moviess.self)
            ListOfMovies.reloadData()
        }
    }

     override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
         if(segue.identifier == "details")
               {
                 let viewController = segue.destination as! DetailViewController
                print(detailsMovies)
                 viewController.conta = detailsMovies 
               }

            }

         }

细节:
import UIKit
import RealmSwift

class DetailViewController: UIViewController, UITableViewDataSource, UITableViewDelegate{

    var conta: Moviess!
    let realm = try! Realm()

    @IBOutlet var tableView: UITableView!
    override func viewDidLoad() {
        super.viewDidLoad()
        tableView.dataSource = self
        tableView.delegate = self
        tableView.reloadData()

    }


    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return [conta].count
     }

     func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "details", for: indexPath) as! DetailsTableViewCell


        let infos = [conta][indexPath.item]

        cell.prepare(movie: infos!)
        return cell
    }   

}

电影
import RealmSwift
import UIKit

class Moviess: Object{
 @objc dynamic var id = 0
 @objc dynamic var title = ""
 @objc dynamic var overview = ""
 @objc dynamic var poster = ""
 @objc dynamic var isFavorites = false

override class func primaryKey() -> String? {
    return "id"
}
convenience init (id: Int){
    self.init()
    self.id = id
}

override class func indexedProperties() -> [String] {
    return ["isFavorites"]
}

func insertMovieData(list: Moviess){
    do {
        let realm = try! Realm()
        try! realm.write({ () -> Void in
            realm.add(list)
        })
    } catch let error as NSError{
        print("insert error : \(error)")
    }
}

func togleFavorite(){
    try? realm?.write{
        isFavorites = !isFavorites
     }
  }
}

我不知道该在哪里给这个“bug”。如果有人可以帮助并解释发生了什么,那将非常有用。

最佳答案

您的问题是prepare(for:sender:)collectionView(_:, didSelectItemAt:)之前被调用。 prepare(for:sender:)不应该依赖collectionView(_:, didSelectItemAt:)

您的prepare(for:sender:)方法应如下所示:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    guard let cell = sender as? UICollectionViewCell,
        let indexPath = ListOfMovies.indexPath(for: cell) else { return }

    if (segue.identifier == "details") {
        let viewController = segue.destination as! DetailViewController
        viewController.conta = movies[indexPath.item]
    }
}

关于ios - 将数据传递到tableViewController时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61419324/

相关文章:

javascript - 在 iOS 上的 Safari 中刷新图像

ios - 声明是否确实需要Objective-C属性吗?

ios - Swift - 在横向时创建 UIButton

SwiftUI 创建以点为指标的图像 slider

java - Realm 数据库跨平台兼容性?

ios - 尝试保存核心数据记录后出错

ios - 如何在文件之间重用相同的代码并可以选择在 Objective-C 中传递参数?

ios - 如何将元组字典保存和读取到 NSUserDefaults?

Android 的 realm.io 如何与服务器端 MySQL DB 同步

android - SQLite 与 Realm 在黑客数据安全方面的比较