Получить данные из вызова API и показать другой viewController при щелчке строки UItableView - PullRequest
0 голосов
/ 10 апреля 2020

Я новичок в Swift, поэтому прошу помощи. Я показываю список символов в табличном представлении с помощью вызова API. Когда пользователь щелкает одну строку, я хочу вызвать API, получить данные и отобразить их в новом viewController
URL вызова 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",
}

И так необходимо для каждого из символов. Скажите или направьте, как это реализовать?

Извините за мой плохой Энгли sh. Мой код:

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
     }


}



1 Ответ

0 голосов
/ 10 апреля 2020

Если я правильно понимаю ваш вопрос, вам нужно реализовать 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)
}

Чтобы это работало, вы будете Нужно иметь другой контроллер вида, чтобы показать персонажа, которого он нажал. Дайте этому контроллеру представления Storyboard ID "characterV C" в Инспекторе идентичности. Контроллеру представления также понадобится переменная для получения символьного объекта, возможно:

class CharacterDetailViewController: UIViewController {

  var character: Character?

  override func viewDidLoad() {
    super.viewDidLoad()

      if let character = character {
        // show the character on the view
      }
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...