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

Posted

技术标签:

【中文标题】从 API 调用获取数据并在 UItableView 行单击上显示另一个 viewController【英文标题】:Get data from API call and show another viewController on UItableView row click 【发布时间】:2020-04-10 09:08:47 【问题描述】:

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

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
     






【问题讨论】:

在该 API 调用中,您可以获得近 500 个字符。那么您需要从响应中动态显示字符数还是手动显示 1-20? @DilanAnuruddha 现在我不知道如何在 tableview 中动态获取 500 个字符,但我正在寻找如何做到这一点 【参考方案1】:

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

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

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

为此,您需要使用另一个视图控制器来显示点击后的角色。在身份检查器中为该视图控制器提供“characterVC”的故事板 ID。视图控制器还需要一个变量来接收字符对象,也许:

class CharacterDetailViewController: UIViewController 

  var character: Character?

  override func viewDidLoad() 
    super.viewDidLoad()

      if let character = character 
        // show the character on the view
      
  

【讨论】:

是的,你是对的,但是如何在代码上实现这个 @Kyrylovep 已经用一些代码示例修改了我的答案,让我知道是否需要进一步澄清 这一行对我不起作用 - charactersViewController.character = character present(charactersViewController.character, animated: true) 错误:“'UIViewController' 类型的值没有成员'character'” @Kyrylovep 我的错,忘了投射视图控制器。再次编辑代码

以上是关于从 API 调用获取数据并在 UItableView 行单击上显示另一个 viewController的主要内容,如果未能解决你的问题,请参考以下文章

VB.NET 和 XmlElement() 如何从 API 调用中获取元素的值?

Flutter:如何从 api 获取数据并在 PaginatedDataTable 中绑定

如何从两个不同的 api 模拟中获取数据?迅速

从异步函数中获取数据

Vue.js - 从 API 获取数据并在 Vuex 状态更改时重新加载组件

从API获取Json数据并在Unity C中仅显示部分json#