从API调用获取数据并在UItableView行上显示另一个viewController单击

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

我是Swift的新手,所以我寻求帮助。我使用API​​调用在tableview上显示字符列表。当用户单击一行时,我要调用API,获取数据并将其显示在新的viewController中API调用网址如下所示:

https://rickandmortyapi.com/api/character/ {user_clicked_row_charactor_id}

id的样本响应= 3

{
"id": 3,
"name": "Summer Smith",
"status": "Alive",
"species": "Human",
"type": "",
"gender": "Female",
}

因此每个字符都是必需的。告诉或指示如何执行此操作?

对不起,我的英语不好。我的代码:

class UsersTableViewController: UITableViewController {



    var characters = [Results]()



     override func viewDidLoad() {
         super.viewDidLoad()

        LoadCharacters()

    }
    func LoadCharacters() {
        let urlString = "https://rickandmortyapi.com/api/character/"


        if let url = URL(string: urlString)
        {
            let session = URLSession(configuration: .default)

            let task = session.dataTask(with: url) { (data, responce, error) in
            if error != nil {
                       print(error!)
                       return
            }

                if let safeData = data {
                    self.parseJson(usersData: safeData)

                    DispatchQueue.main.async {
                        self.tableView.reloadData()
                    }
                }
            }

            task.resume()
            self.tableView.reloadData()
        }
    }

    func parseJson(usersData: Data) {
        let decoder = JSONDecoder()
        do {


            let decodedData = try decoder.decode(JSONData.self, from: usersData)
            characters = decodedData.results
            print(decodedData.results[0].name)
        } catch {
            print(error)
        }
        }







     struct JSONData: Decodable {
         let results: [Results]
     }
     struct Results: Decodable {
         let name: String

     }

     // MARK: - Table view data source
     override func numberOfSections(in tableView: UITableView) -> Int {
         return 1
     }

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

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



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

        let guys = characters[indexPath.row]

        cell.textLabel?.text = guys.name


   return cell
     }


}



json swift api uitableview viewcontroller
1个回答
0
投票

如果我正确理解了您的问题,则需要实现表格视图方法的didSelectRowAt,然后将必要的数据传递给新的视图控制器:

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

    let character = characters[indexPath.row]
    let charactersViewController = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(identifier: "characterVC")
    charactersViewController.character = character
    present(charactersViewController.character, animated: true)
}

为此,您必须有另一个视图控制器才能在点按该字符时显示该字符。在身份检查器中为该视图控制器提供故事板ID“ characterVC”。视图控制器还需要一个变量来接收字符对象,也许:

class CharacterDetailViewController: UIViewController {

  var character: Character?

  override func viewDidLoad() {
    super.viewDidLoad()

      if let character = character {
        // show the character on the view
      }
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.