Как заполнить UITableView данными, которые я получаю на ViewDidLoad? - PullRequest
0 голосов
/ 14 марта 2019

Я пытаюсь получить некоторые данные с помощью Alamofire и пытаюсь поместить некоторые из этих данных в массив

class BaseFormViewController : UIViewController, UITableViewDelegate, UITableViewDataSource {

let colorPalette = VOCColorPaletteManager()
let form = GetEmployeeCompositionApp()

let baseUrl = url
let parameters = parameters
var jsonData : EmployeeCompositionApp?

var separators : [Separator]?

// ------ IBOutlets ------

@IBOutlet weak var formTableView: UITableView!

/***   TableView   ***/
var xibCell = "BaseFormCell"
var reuseIdentifier = "BaseFormCell"



override func viewDidLoad() {
    super.viewDidLoad()

    self.view.backgroundColor = colorPalette.clearGrayColorObject()
    self.formTableView.delegate = self
    self.formTableView.dataSource = self
    self.formTableView.register(UINib(nibName: xibCell, bundle: nil), forCellReuseIdentifier: reuseIdentifier)

    requestAllForms()

}

этот requestAllForms() в ViewDidLoad - это метод, который я использую для получения этих данных

 func requestAllForms() {

        /*****    Petición a API    *****/

    Alamofire.request(baseUrl,
                      method: .post,
                      parameters: parameters)
        .responseJSON { response in

            guard response.result.error == nil else {
                print("Error en petición a Alamofire:\n \(String(describing: response.result.error))")
                return
            }
            guard let json = response.result.value as? [String : Any] else {
                print("No se ha podido extraer un archivo JSON")
                if let error = response.result.error {
                    print("Error : \(error.localizedDescription)")
                }
                return
            }

            /******    Parseado de JSON    *****/
            do {
                let decoder = JSONDecoder()
                let rawData = try JSONSerialization.data(withJSONObject: json, options: [])
                let objectData = try decoder.decode(EmployeeCompositionApp.self, from: rawData)
                self.jsonData = objectData

            /*****    Metiendo datos en los arrays correspondientes    *****/

                for item in objectData.data.elements.separators {

                    self.separators?.append(item)

                }
                self.formTableView.reloadData()


            } catch let error {
                print("Error: \n", error)
            }

    }

}

Но когда я пытаюсь получить доступ к ViewController, он падает, я думаю, это потому, что в массиве еще ничего нет

func numberOfSections(in tableView: UITableView) -> Int {
    return 1
}

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

    return (separators?.count)!
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    let cell = tableView.dequeueReusableCell(withIdentifier: reuseIdentifier, for: indexPath) as! BaseFormCell

    for item in (jsonData?.data.elements.separators)! {


        separators.append(item)
        cell.idLabel.text = item.separatorId
        cell.nameLabel.text = item.name
        cell.typeLabel.text = item.separatorType
        let separatorsID = item.separatorId
        cell.idLabel.text = separatorsID
        print("separators id: \(separatorsID)")
        let separatorsName = item.name
        cell.idLabel.text = separatorsName

        let separatorType = item.separatorType
        cell.idLabel.text = separatorType
    }



    return cell
}

Когда он выходит из строя на консоли, есть только (lldb)

и Xcode выдает ошибку

Thread 1: EXC_BREAKPOINT (code=1, subcode=0x103216bdc)

Что я делаю не так?Есть ли лучший способ использовать объекты, которые я получаю от Json, чем помещать их в массив внутри замыкания?

Спасибо

Ответы [ 2 ]

0 голосов
/ 14 марта 2019

Ваши разделители никогда не инициализируются при вызове numberOfRowsInSection.

Ваше свойство separators фактически никогда не инициализируется в вашем коде. Разделители добавляются в ваше закрытие alamofire, которое является асинхронным. НО, ваши разделители еще никогда не инициализируются, поэтому они ничего не сделают.

var separators : [Separator]? 

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

    return (separators?.count)! // Force unwrapping nil will cause crash
    return separators?.count ?? 0 // Safely unwrap like so.. Default 0 if separators is nil
}

// Alamofire closure
for item in objectData.data.elements.separators {
  self.separators?.append(item) // Appending to uninitialized array
}

Еще лучше, не используйте разделители как дополнительные. Возможно, вам придется исправить дополнительные ошибки цепочки.

var separators = [Separator]()

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return separators.count
}
0 голосов
/ 14 марта 2019

Вы должны поставить checkin в numberOfRowsInSection следующим образом: -

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    if separators != nil{
    return (separators?.count)!
   }
return 0
}

Ваше приложение падает, потому что могут быть сценарии, в которых массив портов не имеет значений, и вы пытаетесь заполнить его массивом nil.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...