如何用我在ViewDidLoad上收到的数据填充UITableView?

时间:2019-03-14 17:14:22

标签: json swift uitableview

我正在尝试使用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()

}

ViewDidLoad中的这个requestAllForms()是我用来获取这些数据的方法

 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 :(得分:0)

您应按如下所示将检查放入numberOfRowsInSection中:-

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

您的应用程序崩溃了,因为在某些情况下,海港数组没有值,而您试图用nil数组填充它。

答案 1 :(得分:0)

调用numberOfRowsInSection时,不会初始化分隔符。

实际上,您的spacers属性永远不会在代码中初始化。 分隔符将附加在异步的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
}