Показать данные из структуры в UITableView - PullRequest
0 голосов
/ 18 мая 2018

Мне кажется, что я что-то упускаю, когда дело доходит до просмотра таблиц в Swift 4, или, может быть, я просто не передаю свои данные, как я должен ... Я читаю json, который должен сохранить в структуре "Рабочая область"и затем я использую эту же структуру для отображения данных в моем табличном представлении

У меня есть этот класс:

public class User {

    var Wor = [Workspace]()
    var WorData = Workspace()

}

И эта структура: функция getuserWorkspace должна обновлять значения структуры.

struct Workspace: Decodable {
    var guid: String
    var name: String

private enum CodingKeys : String, CodingKey {
    case guid = "guid"
    case name = "name"
}

init(){
    self.guid = "guid"
    self.name = "name"
}

mutating func getUserWorkspace(base: String, completed: @escaping () -> ()){
    let url = URL(string: "SOME URL")!
    var request = URLRequest(url: url)
    request.addValue("Basic \(base)", forHTTPHeaderField: "Authorization")
    request.addValue("application/json", forHTTPHeaderField: "Accept")
    URLSession.shared.dataTask(with: request){ (data, response, error) in
        if error == nil {
            do {
                let rep = try JSONDecoder().decode([Workspace].self, from: data!)
                print(rep) 
                //it prints exactly what I receive so I guess I'm saving it well? 
                DispatchQueue.main.async {
                    completed()
                }
            }catch {
                print(error)
            }
        }
    }.resume()
}

И у меня есть это в моем контроллере представления:

   var co = User()

override func viewDidLoad() {
    super.viewDidLoad()

    co.getBase()
    co.WorData.getUserWorkspace(base: co.Base) {
        print("success")
        self.listView.reloadData()
        self.updateVertically()
    }
    print("guid " + co.WorData.guid)
    print("name " + co.WorData.name)
    print("work ", co.WorData)
    print("wor ", co.Wor)
    listView.delegate = self
    listView.dataSource = self
}

В строках таблицы я возвращаю co.Wor.count И в строке ячейки co.Wor[indexPath.row].name

Но все пусто И отпечатки дают мне это:

guid guid
name name
work  Workspace(guid: "guid", name: "name")
wor  []
[Proj.Workspace(guid: "8a81b08e45467656fr467f51119047027", name: "test ok")]
(this print is inside the function in the structure)
success

Я действительно запутался в том, как решить проблему

1 Ответ

0 голосов
/ 18 мая 2018

1 - предпочтительно установить источник данных и делегировать верхнюю часть viewDidLoad

override func viewDidLoad() {
  super.viewDidLoad()
   listView.delegate = self
  listView.dataSource = self
}

2- Назначьте данные после того, как вы их получите

mutating func getUserWorkspace(base: String, completion: @escaping (_ arr:[Workspace]?) -> void ){
  let rep = try JSONDecoder().decode([Workspace].self, from: data!)
  completion(rep)
}

//

  co.WorData.getUserWorkspace(base: co.Base) { (arr) in 
    print("success")
    self.co.Wor = arr
    self.listView.reloadData()
    self.updateVertically()
}
...