当我运行我的项目时,我只能得到tableView
,但数据不会被取为空白。结构codable
和视图控制器代码如下。请帮助我使用tableView
和alamofire
查看SwiftyJSON
单元格中的数据,
class Loads: Codable {
let loads: [Load]
init(loads: [Load]) {
self.loads = loads
}
}
class Load: Codable {
let id: String
let ad_title: String
let ad_description:String
let ad_price: String
let ad_post_date: String
let image1: String
init(ad_title: String, ad_description: String, ad_price: String, ad_post_date: String, image1: String) {
self.ad_title = ad_title
self.ad_description = ad_description
self.ad_price = ad_price
self.ad_post_date = ad_post_date
self.image1 = image1
}
}
查看控制器代码:
import UIKit
import SwiftyJSON
import Alamofire
class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {
var loads = [Load]()
@IBOutlet weak var tableView: UITableView!
override func viewDidLoad() {
super.viewDidLoad()
downloadJson()
self.tableView.reloadData()
tableView.delegate = self
tableView.dataSource = self
}
func tableView(_ tableView: UITableView, numberOfRowsInSection
section: Int) -> Int {
return loads.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath:
IndexPath) -> UITableViewCell {
guard let cell = tableView.dequeueReusableCell(withIdentifier: "LoadCell") as? LoadCell else { return UITableViewCell() }
cell.labelA.text = loads[indexPath.row].ad_title
cell.labelB.text = loads[indexPath.row].ad_price
cell.labelC.text = loads[indexPath.row].ad_description
cell.labelD.text = loads[indexPath.row].ad_post_date
if let imageURL = URL(string: loads[indexPath.row].image1) {
DispatchQueue.global().async {
let data = try? Data(contentsOf: imageURL)
if let data = data {
let image = UIImage(data: data)
DispatchQueue.main.async {
cell.loadImage.image = image
}
}
}
}
return cell
}
func downloadJson(){
Alamofire.request("https://alot.ae/api/classifiedcomputerlaptop.php").responseJSON { response in
if let value = response.result.value {
let json = JSON(value)
//Printing strings from a JSON Dictionary
print(json[0]["ad_title"].stringValue)
print(json[0]["ad_price"].stringValue)
print(json[0]["ad_description"].stringValue)
print(json[0]["ad_post_date"].stringValue)
print(json[0]["image1"].stringValue)
}
self.tableView.reloadData()
}
self.tableView.reloadData()
}
}
我正在使用xcode9,swift 4。
答案 0 :(得分:1)
数据未获取其空白
您的代码似乎没有通过下载的数据更新var loads
,这就是您获得空白表格视图的原因。因此,您需要将提取的数据分配给var loads
。
以下是样本:
Alamofire.request("https://alot.ae/api/classifiedcomputerlaptop.php").responseJSON { response in
// you should assign response data into var loads here
if let data = response.data {
do {
self.loads = try JSONDecoder().decode([Load].self, from: data)
} catch {
// exception
}
}
}
之后,self.tableView.reloadData()
。
PS:当然我不知道您的回复JSON格式和整体源代码,所以它可能不是您的问题的目录答案,但我希望它会有所帮助!
答案 1 :(得分:0)
<div id= "row" class="Row">
<label>Row1:</label>
<div id= "CCol1" class="CCol">
<input type="text" class="width100"><input type="number" placeholder="1" value="1" class="CHeight"><input type="number" placeholder="1" value="1" class="CWidth">
</div>
<div id= "CCol2" class="CCol">
<input type="text" class="width100"><input type="number" placeholder="1" value="1" class="CHeight"><input type="number" placeholder="1" value="1" class="CWidth">
</div>
<div id= "CCol3" class="CCol">
<input type="text" class="width100"><input type="number" placeholder="1" value="1" class="CHeight"><input type="number" placeholder="1" value="1" class="CWidth">
</div>
<div id= "CCol4" class="CCol">
<input type="text" class="width100"><input type="number" placeholder="1" value="1" class="CHeight"><input type="number" placeholder="1" value="1" class="CWidth">
</div>
<div id= "CCol5" class="CCol">
<input type="text" class="width100"><input type="number" placeholder="1" value="1" class="CHeight"><input type="number" placeholder="1" value="1" class="CWidth">
</div>
</div>
输入两次,请在下方删除一次。
改变这个:
https
到:
Alamofire.request("https:https://alot.ae/api/classifiedcomputerlaptop.php").responseJSON
答案 2 :(得分:0)
首先,你的......
struct codable
...根本不是结构,它是一个类。将其更改为实际的结构。
其次,在委托和数据源设置为tableview之前开始下载。
override func viewDidLoad() {
super.viewDidLoad()
tableView.delegate = self
tableView.dataSource = self
downloadJson()
}
第三,您正在使用Alamofire进行简单的GET请求,但是您忽略了使用Data
对单元格进行异步加载图像的事实。我建议一起使用AlamoFireImageDownloader或远程AlamoFire。使用URLSession同样简单:
private func request(url: URL, completionHandler: @escaping ((Data?, URLResponse?, Error?) -> Void)) {
var request = URLRequest(url: url)
request.httpMethod = "GET"
let task = URLSession.shared.dataTask(with: request, completionHandler: completionHandler)
task.resume()
}
第四,我不相信你需要loads
可编码。
只是额外提醒,根据您在桌面上的Load
数量,您将遇到加载图片的问题。闭包不能保证按顺序完成,但是当它们这样做时,它们将更新单元格,无论单元格是否已经被重用于另一个Load
。仅供参考。