我正在尝试使用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获得的对象更好的方法,而不是将它们放入闭包内部的数组中?
谢谢
答案 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
}