从 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 中绑定