首页 > 解决方案 > 追加不是触发。- JSON 斯威夫特

问题描述

所以我目前有以下有效的代码

  func createArray() -> [News] {

           return [News(title: "Hello") , News(title: "how") , News(title: "You")]

    }

但是我想要的是用远程 JSON 数据替换它,到目前为止,我让它工作到没有错误的地步。

然而,tableViewCell 似乎不想工作 - 我相信它与 append 函数有关。

tempNews.append(News(title: $0.title))

现在我检查 $0.title 是否打印出标题并且它确实如此所以问题必须是其他的东西。

newsdata.news.forEach(){
                                print($0.title)

                               // tempNews.append(News(title: $0.title))
                             tempNews.append(News(title: "1123"))

                            }

返回

Please stay safe on the roads.
Lost Beliefs
Dami Im - Crying Underwater
Dear Extinction Rebellion Protesters
Billie Eilish All Good Girls Go To Hell (Music Video Review)
Inferno Engulfs Conception
Council Kills Australian Icon
Third Time Lucky - pilot lands
Anchors Away For Ross Lyon
Sydney Under Attack
With Friends Like This...
Papa You Did Wrong
6Year Old French Tourist Injured
Bendigo Woman First Victorian to use new Assisted Dying Act
America Shocked By Back To Back Shootings
Channel Ten’s The Project Infighting Backstage.

但是当我尝试 tempNews.append(News(title: "1123"))

它不会将它附加到 tempNews 所以我现在知道附加不起作用。

以下确实附加

 func createArray() -> [News] {
        //var tempNews = [News] = []
        var tempNews : [News] = []


        let news1 = News(title: "Hello")
        let news2 = News(title: "how")
        let news3 = News(title: "You")

        tempNews.append(news1)
        tempNews.append(news2)
        tempNews.append(news3)

        return tempNews
    }

代码

 func newsfetch() -> [News]{
        var artical = Array<Any>()
        var tempNews: [News] = []
                    let jsonURLString = "https://api.drn1.com.au/api-access/news"
                    guard let feedurl = URL(string: jsonURLString) else {  return tempNews }

                      URLSession.shared.dataTask(with: feedurl) { (data,response,err)
                          in

                          guard let news = data else { return }

                          do{
                            let newsdata = try JSONDecoder().decode(NewsData.self, from: news)

                            newsdata.news.forEach(){
                                print($0.title)

                               // tempNews.append(News(title: $0.title))
                                artical = News(title: "1123")

                            }


                            }catch let jsonErr{

                                print("error json ", jsonErr)
                            }


                      }.resume()


        return tempNews(artical)


          }

带卡姆兰代码的完整代码

//
//  NewsViewController.swift
//  DRN1
//
//  Created by Russell Harrower on 26/11/19.
//  Copyright © 2019 Russell Harrower. All rights reserved.
//

import UIKit


struct NewsData: Decodable{
    let news: [articalData]
}

struct articalData: Decodable{
    let title: String
}

class NewsViewController: UIViewController {
    @IBOutlet weak var tableView: UITableView!

    var news: [News] = []

    override func viewDidLoad() {
      super.viewDidLoad()
        self.newsfetch { news in
            guard let news = news else { return }
        }

        //news = createArray()
      // Do any additional setup after loading the view.
        tableView.delegate = self
        tableView.dataSource = self
    }

    func createArray() -> [News] {

           return [News(title: "Hello") , News(title: "how") , News(title: "You")]

    }

    func newsfetch(_ completionHandler:  @escaping ([News]?)->Void){
        let jsonURLString = "https://api.drn1.com.au/api-access/news"
        guard let feedurl = URL(string: jsonURLString) else {  return }

        URLSession.shared.dataTask(with: feedurl){ (data,response,err)
            in
            guard let news = data else { return }
            do {
                let newsdata = try JSONDecoder().decode(NewsData.self, from: news)
                var tempNews: [News] = []
                newsdata.news.forEach(){
                    tempNews.append(News(title: $0.title))
                }
                completionHandler(tempNews)
            } catch let jsonErr {
                print("error json ", jsonErr)
                completionHandler(nil)
            }
        }.resume()

    }


    /*func newsfetch() -> [News]{

        var tempNews: [News] = []
                    let jsonURLString = "https://api.drn1.com.au/api-access/news"
                    guard let feedurl = URL(string: jsonURLString) else {  return tempNews }

                      URLSession.shared.dataTask(with: feedurl) { (data,response,err)
                          in

                          guard let news = data else { return }

                          do{
                            let newsdata = try JSONDecoder().decode(NewsData.self, from: news)

                            newsdata.news.forEach(){

                                DispatchQueue.main.async {
                                    print($0.title)

                                    tempNews.append(News(title: $0.title))
                                    print(tempNews.count)
                                }
                            }
                            }catch let jsonErr{

                                print("error json ", jsonErr)
                            }


                      }.resume()



        return tempNews

        }*/


  override func viewDidAppear(_ animated: Bool) {
    self.tabBarController?.navigationItem.title = "News"

          //     let controller = AVPlayerViewController()
            //    controller.player = player

                // Modally present the player and call the player's play() method when complete.
          //      present(controller, animated: false) {
           //       player.play()
           //     }


  }

}


extension NewsViewController: UITableViewDataSource, UITableViewDelegate {
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return news.count
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let newsa = news[indexPath.row]

        let cell = tableView.dequeueReusableCell(withIdentifier: "NewsCell") as! NewsCell
        cell.setNews(news: newsa)
        return cell
    }
}

问题在屏幕上,表格仍然是空白的。

标签: jsonswift

解决方案


推荐阅读