Отображение данных JSON в табличном представлении - PullRequest
0 голосов
/ 14 декабря 2018

Я не могу отобразить данные JSON в моем табличном представлении, я не знаю почему.Я пытался получить данные JSON, но не смог отобразить их на экране в табличном формате.

import UIKit

class User{
    var userId : Int
    var id : Int
    var title : String
    var completed : Bool

    init (userId : Int , id: Int, title : String, completed : Bool){
        self.userId = userId
        self.id = id
        self.title = title
        self.completed = completed
    }
}



class ViewController: UITableViewController{

    var users = [User]()

    let cellId = "cellId"

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

        //makePostCall()
}


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

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: cellId, for: indexPath)
        let user = users[indexPath.row]
        cell.textLabel?.text = user.title
        cell.detailTextLabel?.text = user.title
        return cell
    }

    func makeGetCall(){

       // users = []

        let todoEndpoint: String = "http://jsonplaceholder.typicode.com/todos"
        guard let url = URL(string: todoEndpoint) else {
            print("Error: cannot create URL")
            return
        }
        let urlRequest = URLRequest(url: url)

        // set up the session
        let config = URLSessionConfiguration.default
        let session = URLSession(configuration: config)

        // make the request
        let task = session.dataTask(with: urlRequest) {
            (data, response, error) in
            // check for any errors
            guard error == nil else {
                print("error calling GET on /todos/1")
                print(error!)
                return
            }
            // make sure we got data
            guard let responseData = data else {
                print("Error: did not receive data")
                return
            }
            // parse the result as JSON, since that's what the API provides
            do {
                let todo = try JSONSerialization.jsonObject(with: responseData, options: .mutableLeaves)
                    as? NSArray

                for eachUser in todo! {
                    let eachUsers = eachUser as! [String : AnyObject]
                    let userId = eachUsers["userId"] as! Int
                    let id = eachUsers["id"] as! Int
                    let title = eachUsers["title"] as! String
                    let completed = eachUsers["completed"] as! Bool

                    self.users.append(User(userId: userId, id: id, title: title, completed: completed))
                    print(eachUser)

                    DispatchQueue.main.async {
                        self.tableView.register(UITableViewCell.self, forCellReuseIdentifier: self.cellId)
                    }

                }

            } catch  {
                print("error trying to convert data to JSON")
                return
            }
        }
        task.resume()
}


    func makePostCall() {
        let todosEndpoint: String = "https://jsonplaceholder.typicode.com/todos"
        guard let todosURL = URL(string: todosEndpoint) else {
            print("Error: cannot create URL")
            return
        }
        var todosUrlRequest = URLRequest(url: todosURL)
        todosUrlRequest.httpMethod = "POST"
        let newTodo: [String: Any] = ["title": "First todo", "completed": false, "userId": 1]
        let jsonTodo: Data
        do {
            jsonTodo = try JSONSerialization.data(withJSONObject: newTodo, options: [])
            todosUrlRequest.httpBody = jsonTodo
        } catch {
            print("Error: cannot create JSON from todo")
            return
        }

        let session = URLSession.shared

        let task = session.dataTask(with: todosUrlRequest) {
            (data, response, error) in
            guard error == nil else {
                print("error calling POST on /todos/1")
                print(error!)
                return
            }
            guard let responseData = data else {
                print("Error: did not receive data")
                return
            }

            // parse the result as JSON, since that's what the API provides
            do {
                guard let receivedTodo = try JSONSerialization.jsonObject(with: responseData,options: []) as? [String: Any] else {
                    print("Could not get JSON from responseData as dictionary")
                    return
                }
                print("The todo is: " + receivedTodo.description)

                guard let todoID = receivedTodo["id"] as? Int else {
                    print("Could not get todoID as int from JSON")
                    return
                }


                print("The ID is: \(todoID)")
            } catch  {
                print("error parsing response from POST on /todos")
                return
            }
        }
        task.resume()
    }

}

1 Ответ

0 голосов
/ 14 декабря 2018

Вам необходимо перезагрузить таблицу после добавления данных

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

И строка регистра должна быть в viewDidLoad

self.tableView.register(UITableViewCell.self, forCellReuseIdentifier: self.cellId)

Хороший способ также заключается в использовании

struct User :Decodable{ 
  let userId , id : Int 
  let title : String 
  let completed : Bool
}

users = try? JSONDecoder().decode([User].self,from:data)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...