数据未从JSON加载到第二个视图控制器上

问题描述 投票:1回答:2

我终于能够将API中的数据加载到表格视图中。当我切换到角色时,我想在下一个视图控制器中获取有关他的数据。但是,当我切换到下一个VC时,没有任何错误,但是我的数据为零。请帮助我,告诉我我做错了什么,我的错在哪里?

我有Data.swift

struct PagedCharacters: Decodable {
    let info: Info
    let results: [Results]

}
struct Info: Decodable {
    let count: Int
    let pages: Int
    let next: String
    let prev: String
}

struct Results: Decodable {
    let id: Int
    let name: String
    let status: String
    let species: String
    let image: String
    let url: String
    let type: String
}

我的主要风投:Viewcontroller.swift

class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {

      @IBOutlet weak var uiTableView: UITableView!
       var characters:[Results]?
           var nextPageUrl:String!

           override func viewDidLoad() {
               super.viewDidLoad()
               getIntitalRickAndMortyData()


               self.uiTableView.dataSource = self
               self.uiTableView.delegate = self

               // Do any additional setup after loading the view.
           }






           func getIntitalRickAndMortyData(){
               characters = []
               //here first page is next page
               nextPageUrl = "https://rickandmortyapi.com/api/character/"
               getRickAndMortyData()
           }

           func getRickAndMortyData() {

               //construct the url, use guard to avoid nonoptional
               guard let urlObj = URL(string: nextPageUrl) else
               { return }

               //fetch data
               URLSession.shared.dataTask(with: urlObj) {[weak self](data, response, error) in

                   //to avoid non optional in JSONDecoder
                   guard let data = data else { return }

                   do {
                       //decode object
                       let downloadedRickAndMorty = try JSONDecoder().decode(PagedCharacters.self, from: data)
                       self?.characters?.append(contentsOf: downloadedRickAndMorty.results)
                       self?.nextPageUrl = downloadedRickAndMorty.info.next

                       DispatchQueue.main.async {
                           self?.uiTableView.reloadData()
                       }
                       print(self?.characters as Any)

                   } catch {
                       print(error)

                   }

                   }.resume()

           }


           func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
               return self.characters?.count ?? 0
           }

           func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {



               if let count = characters?.count, count>1{
                   let lastElement = count - 1
                   if indexPath.row == lastElement {
                       //call get api for next page
                       getRickAndMortyData()

                   }
               }


              let cell = tableView.dequeueReusableCell(withIdentifier: "characterCell", for: indexPath)


             cell.textLabel?.text = "Name: " + (self.characters?[indexPath.row].name ?? "default")

               return cell
           }

    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        let character = characters?[indexPath.row]
           performSegue(withIdentifier: "toCharacterDetailVC", sender: self)
        print(character?.name)
       }

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {

       if segue.identifier == "toCharacterDetailVC" {
           if let destVC = segue.destination as? CharacterDetailViewController {
              destVC.character = sender as? Results

       }
    }



       }
}

和第二个VC CharacterDetailViewController

import UIKit


class CharacterDetailViewController: UIViewController {


    @IBOutlet var statusLabel: UILabel!
    @IBOutlet var speciesLabel: UILabel!
    @IBOutlet var typeLabel: UILabel!

public var character: Results?


    override func viewDidLoad() {

       title = character?.name
              statusLabel.text = character?.status
              speciesLabel.text = character?.species
              typeLabel.text = character?.type == "" ? "Not Available" : character?.type
              print(character?.name)
        super.viewDidLoad()



}
}

ios json swift uitableview uiviewcontroller
2个回答
1
投票
var character: Results? {
    didSet {
        title = character?.name
        statusLabel.text = character?.status
        speciesLabel.text = character?.species
        typeLabel.text = character?.type == "" ? "Not Available" : character?.type
    }
}

0
投票

似乎您没有在第二个View控制器中分配该字符。首先将其公开。

public var character: Results?

然后在调用第二个视图控制器之前根据用户选择分配字符。

 func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
       let character = characters[indexPath.row]
        self.performSegue(withIdentifier: "toCharacterDetailVC ", sender: testArray)
    }

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {

   if segue.identifier == "toCharacterDetailVC" {
       if let destVC = segue.destination as? CharacterDetailViewController {
          destVC.character = sender as! Results 

   }
}
© www.soinside.com 2019 - 2024. All rights reserved.