我使用TableView和带有三个标签的Prototype Cell从JSON创建了一个新闻提要,但遇到了问题。尽管JSON有所不同,但所有供稿行都提取相同的数据。
JSON给我的应用程序15个数据块。所有行均显示必须为最后的内容。
似乎数组有错误并且不正确。但是我不明白为什么tableview仅从他那里获取最后一行数据并放入每个单元格中。
我的问题是什么原因?我做错了什么?请帮助我。
class SecondViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "newsfeedCell", for: indexPath) as! NewsFeedCell
cell.newsfeed_title.text = self.news?[indexPath.item].headline
//cell.newsfeed_title.text = "Динамо обыграло Шахтер"
cell.newsfeed_topic.text = self.news?[indexPath.item].topic
//cell.newsfeed_topic.text = "Премьер-лига"
cell.newsfeed_time.text = self.news?[indexPath.item].time
//cell.newsfeed_time.text = "17:22"
return cell
}
func numberOfSections(in tableView: UITableView) -> Int {
return 1
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return self.news?.count ?? 0
} //number of rows
@IBOutlet weak var tableview: UITableView!
var news: [Newsfeed]? = []
override func viewDidLoad() {
super.viewDidLoad()
getJSON()
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
func getJSON(){
let urlRequest = URLRequest(url: URL(string: "any_json_url")!)
let task = URLSession.shared.dataTask(with: urlRequest) { (data,response,error) in
if error != nil {
print(error as Any)
return
}
self.news = [Newsfeed]()
do {
let json = try JSONSerialization.jsonObject(with: data!, options: .mutableContainers) as! NSArray
let NF = Newsfeed()
for arrayX in json as! [[String: AnyObject]] {
if let ID = arrayX["id"],
let date = arrayX["date"],
let status = arrayX["status"],
let title0 = arrayX["title"] as? [String: Any],
let title = title0["rendered"] {
NF.headline = title as? String
NF.topic = status as? String
NF.id = ID as? String
NF.time = date as? String
print(ID)
print(title)
print(date)
print(status)
}
self.news?.append(NF)
}
DispatchQueue.main.async {
self.tableview.reloadData()
}
} catch let error {
print(error)
}
}
task.resume()
}
}
答案 0 :(得分:1)
您始终将其写入相同的Newsfeed
实例中,并且如果它是一个类,则显然是–您正在使用始终相同的对象。
更改顺序。替换
let NF = Newsfeed()
for arrayX in json as! [[String: AnyObject]] {
with(在Swift 3+中,JSON字典始终是[String:Any]
)
for arrayX in json as! [[String: Any]] {
let NF = Newsfeed()
并将数据源数组声明为非可选
var news = [Newsfeed]()
然后,您将摆脱很多问号和return self.news?.count ?? 0
这样的丑陋语法。只需返回self.news.count
答案 1 :(得分:0)
也许:
cell.newsfeed_title.text = self.news?[indexPath.row].headline