无法从JSON提取原型单元格

时间:2018-08-17 16:17:39

标签: ios arrays swift xcode tableview

我使用TableView和带有三个标签的Prototype Cell从JSON创建了一个新闻提要,但遇到了问题。尽管JSON有所不同,但所有供稿行都提取相同的数据。

JSON给我的应用程序15个数据块。所有行均显示必须为最后的内容。

似乎数组有错误并且不正确。但是我不明白为什么tableview仅从他那里获取最后一行数据并放入每个单元格中。

我的问题是什么原因?我做错了什么?请帮助我。

enter image description here

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()

}
}

2 个答案:

答案 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