Json数据没有显示在tableView上

时间:2016-12-20 10:54:44

标签: ios json swift uitableview widget

我正在使用Swift为iOS构建一个小部件。主应用程序的目的是连接到URL新闻源并获取最新消息,而小部件仅获取要在Today视图中的tableView中显示的标题。

我已经为窗口小部件编写了这个方法,以便获取数据来填充表格,但由于某种原因没有显示任何内容。我试图调试它,但作为一个小部件似乎实际上是不可能的。

这是cellForRowAt,我连接到feed并尝试提取数据。有趣的是,主应用程序使用基本相同的代码,它完美地运行。

     override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
      let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)


      let urlRequest = URLRequest(url: URL(string: "https://newsapi.org/v1/articles?source=techcrunch&sortBy=top&apiKey=c64849bc30eb484fb820b80a136c9b0a")!)


      let task = URLSession.shared.dataTask(with: urlRequest) { (data,response,error) in

           do{

                let json = try JSONSerialization.jsonObject(with: data!, options: .mutableContainers) as! [String: AnyObject]

                if let articlesFromJson = json["articles"] as? [[String: AnyObject]] {

                     if !(error != nil) {

                          var resultArray: NSMutableArray = NSMutableArray()

                          for articlesFromJson in articlesFromJson {

                               if let title = articlesFromJson["title"] as? String{
                                    resultArray.add(title)

                               }

                               let array:NSArray = resultArray.reverseObjectEnumerator().allObjects as NSArray
                               resultArray = array as! NSMutableArray
                               let title:String = resultArray.object(at: indexPath.row) as! String
                               cell.textLabel?.text = title

                          }
                     }            
                }

                //reload on main thread to speed it up
                DispatchQueue.main.async {
                 self.tableView.reloadData()
                }

           } catch let error {
                print(error)
           }            
      }
      task.resume()

      return cell
 }

如果有人可以帮我弄清楚错误在哪里会有很大的帮助,我已经坚持了几天这个问题。感谢

2 个答案:

答案 0 :(得分:3)

您希望在cellForRow之外创建网络请求,然后在完成后重新加载数据,以使tableView重新加载调用cellForRow的单元格。

将数据数组存储在请求之外,以便您可以从函数外部引用它。

var resultArray: NSMutableArray = []

override func viewDidLoad() {
   super.viewDidLoad()
   getData()
 }     

func getData() {
  let urlRequest = URLRequest(url: URL(string: "https://newsapi.org/v1/articles?source=techcrunch&sortBy=top&apiKey=c64849bc30eb484fb820b80a136c9b0a")!)

  let task = URLSession.shared.dataTask(with: urlRequest) {[weak self] (data,response,error) in
    guard let strongSelf = self else { return }
    do{
        let json = try JSONSerialization.jsonObject(with: data!, options: .mutableContainers) as! [String: AnyObject]
        if let articlesFromJson = json["articles"] as? [[String: AnyObject]] {
            if error == nil {
                for articlesFromJson in articlesFromJson {
                    if let title = articlesFromJson["title"] as? String{
                        strongSelf.resultArray.add(title)
                    }
                    let array:NSArray = strongSelf.resultArray.reverseObjectEnumerator().allObjects as NSArray
                    strongSelf.resultArray = array as! NSMutableArray

                    DispatchQueue.main.async {
                        strongSelf.tableView.reloadData()
                    }

                } catch let error {
                    print(error)
                }            
            }
            task.resume()
     }

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
  let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)

  let title:String = resultArray.object(at: indexPath.row) as! String

  cell.textLabel?.text = title

  return cell
}

答案 1 :(得分:0)

checks proper if TableView delegate or datasource proper connected. and check array count before load data in cell 
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)
if (resultArray.count > 0){
      let title:String = resultArray.object(at: indexPath.row) as! String

  cell.textLabel?.text = title
}
else
{
  print("Error: resultArray contain nil value ")
}


  return cell
}