快速在动态tableview单元格中使用JSON响应

时间:2018-08-16 13:35:21

标签: ios json swift uitableview

我有一组对象,这些对象在表格视图中显示在屏幕上。数组中的每个对象都有URL属性,可以从中获取其他信息。

在我的情况下,它是声明的数组,通过将GET请求发送到其URL属性,我可以获得带有声明日期的数据的JSON。

我想在表格视图单元格中表示该发行日期。我应该在哪里提出请求?

  • viewDidLoad循环的for-in
  • tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath)

我尝试了不同的方法,但始终只能得到一个响应(不如array.count那样多)和许多错误。

请帮助并告知从何开始。

import UIKit
import SafariServices

class DetailDeclarationInfoTableViewController: UITableViewController {

    let declarationInfoController = DeclarationInfoController()

    var declarationInfo: DeclarationInfo? {
        didSet {
            print("Received declarationInfo")
        }
    }

    var declarationModifiedDate: [String] = [] {
        didSet {
            tableView.reloadData()
            print("New element in Dates")
            print(declarationModifiedDate)
        }
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        let titleText = String((self.declarationInfo?.items.count)!)
        self.navigationItem.title = "Знайдено \(titleText) декларацій"

        guard let declarationInfo = declarationInfo else { return }
        for declarant in declarationInfo.items {

            declarationInfoController.fetchDeclarationDetails(with: declarant.id) { (declarationInfoElement) in
                if let declarationInfoElement = declarationInfoElement {

                DispatchQueue.main.async {
                    print(declarationInfoElement)
                    print("Success!!")
                    self.declarationModifiedDate.append(declarationInfoElement["declarationType"] as! String)
                    self.tableView.reloadData()
                    }
                }
            }
        }
    }


    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        if let declarationInfo = declarationInfo {
                return (declarationInfo.items.count)
            } else {
                return 0
            }
    }

    override func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat {
        return UITableView.automaticDimension
    }

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

        if let placeOfWork = declarationInfo?.items[indexPath.row].placeOfWork {
            personsPlaceOfWork = placeOfWork
        }

        if (indexPath.row + 1) <= declarationModifiedDate.count {
            date = ", " + declarationModifiedDate[indexPath.row]
        }

        let cellText = (declarationInfo?.items[indexPath.row].lastname)! + " " + (declarationInfo?.items[indexPath.row].firstname)! + ", " + personsPlaceOfWork + date
        cell.textLabel?.text = cellText
        cell.textLabel?.numberOfLines = 0
        cell.backgroundColor = UIColor.backgroundPink

        return cell
    }
  

错误域= NSCocoaErrorDomain代码= 3840“字符0周围的值无效。”用户信息= {NSDebugDescription =字符0周围的无效值。}错误域= NSCocoaErrorDomain代码= 3840“字符0周围的无效值。”用户信息= {NSDebugDescription =字符0周围的无效值。}错误域= NSCocoaErrorDomain代码= 3840“字符0周围的无效值。”用户信息= {NSDebugDescription =字符0周围的无效值。}错误域= NSCocoaErrorDomain代码= 3840“字符0周围的无效值。” UserInfo = {NSDebugDescription =字符0周围的值无效。} [“ declarationYear1”:2016,“ declarationType”:1]成功!日期[“ 1”]

中的新元素

2 个答案:

答案 0 :(得分:0)

获取响应后重新加载Tableview并从viewdidload发出请求。您提到哪种错误?

答案 1 :(得分:0)

问题是,获取数组中第一个对象的信息后,第二个响应是我超出了IP((((