Swift:动态地将 JSON 添加到表单元格数组中

Posted

技术标签:

【中文标题】Swift:动态地将 JSON 添加到表单元格数组中【英文标题】:Swift: Dynamicall adding JSON to table cell array 【发布时间】:2017-02-04 05:30:40 【问题描述】:

我有这段代码,它可以获取 JSON 信息

struct cellData 
    let cell : Int!
    let text : String!
    let image : UIImage!

(结构在控制器类之前的顶层)

var arrayData = [cellData]()

覆盖 func viewDidLoad()

    print(annotationId)
    print(annotationTitle)

    arrayData = [
        cellData(cell : 0, text : annotationTitle, image: #imageLiteral(resourceName: "ln-bkg"))
    ]

    let pumpsURL = "http://www...." + annotationId

    Alamofire.request(pumpsURL).responseJSON  response in

        if response.result.value != nil 
            NSLog("Success")
            let pumpsJSON = JSON(response.result.value!)

            let allPumps = pumpsJSON["Pumps"]
            let number = allPumps.count

            for i in 1..<number 
                let pumpName = pumpsJSON["Pumps"][i]["name"].stringValue
                self.pumpNames.append(pumpName)

                self.arrayData.append(cellData(cell : i, text : pumpName, image: #imageLiteral(resourceName: "ln-bkg")))

            
            print(number)
            print(self.arrayData) // works

        
    


这是将数组中的数据添加到单元格中的函数:

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
    switch (arrayData[indexPath.row].cell) 
    case 0:
        let cell = Bundle.main.loadNibNamed("FirstCell", owner: self, options: nil)?.first as! FirstCell
        cell.firstImage.image = arrayData[indexPath.row].image
        cell.firstCellLabel.text = arrayData[indexPath.row].text
        cell.backgroundColor = UIColor.clear

        return cell

    case 1...10:
        let cell = Bundle.main.loadNibNamed("StationPumpCell", owner: self, options: nil)?.first as! StationPumpCell
        cell.pumpImage.image = arrayData[indexPath.row].image
        cell.pumpLabel.text = arrayData[indexPath.row].text

        return cell

    default:
        let cell = Bundle.main.loadNibNamed("FirstCell", owner: self, options: nil)?.first as! FirstCell
        cell.first.image = arrayData[indexPath.row].image
        cell.firstCellLabel.text = arrayData[indexPath.row].text

        return cell
    

所有这些都可以正常工作。当我想添加导致错误的变量时。 问题是a)

cellData(cell : 0, text : annotationTitle, image: #imageLiteral(resourceName: "ln-bkg")),

不会回显到单元格中(也尝试过self.annotationTitle),即使它打印了。我也不能加pumpName已修复我的错误,它在另一个 ViewController 中被注释掉了,它也没有打印,我的错。

问题b)我不知道如何附加cellData,即。

cellData.append[(cell : 3, text : pumpName, image: #imageLiteral(resourceName: "ln-bkg"))]

我已经尝试并得到错误“无法将值转换为预期的参数”。 已修复在 cmets

a) 将数据添加到数组和 b) 用数组中的变量替换硬编码值(如“A title”)的正确方法是什么? IE。从一个空数组开始,在单元格 0 中附加数据,然后在 for 循环中的单元格 1-X 中附加数据,为allPumps 中的每个 JSON 对象创建一个单元格(单元格#、文本、图像)(通过放置数组.append 到 for 循环中)。

编辑: 现在案例 0:工作正常,案例 1...10:返回空白单元格。当 Cell 1...X 被硬编码时,这很有效。 调试中的打印(self.arrayData):

[Project.cellData(cell: 0, text: Works, image: <UIImage: 0x174096120>, 375, 667), Project.cellData(cell: 1, text: Success, image: <UIImage: 0x1702855a0>, 375, 667), Project.cellData(cell: 2, text: Success, image: <UIImage: 0x17009a090>, 375, 667)]

【问题讨论】:

append 是这样工作的 arrayData.append(cellData(cell : 3, text : pumpName, image: #imageLiteral(resourceName: "ln-bkg")) 同时显示你的类 cellData 的声明 此附加有效,谢谢。我在上面添加了 cellData 结构。 不知道你的第一个问题是什么? 我现在可以在 for 循环中和 for 循环打印 arrayData 之后附加 cellData(效果很好),但由于某种原因,它在 tableView 中返回空白单元格 1...X。跨度> 用您当前的尝试编辑您的问题,以便我可以得到您正在尝试的内容。 【参考方案1】:

在数组中追加所有data 后,您需要重新加载tableView。还要在主线程上重新加载。

Alamofire.request(pumpsURL).responseJSON  response in

    if response.result.value != nil 
        NSLog("Success")
        let pumpsJSON = JSON(response.result.value!)

        let allPumps = pumpsJSON["Pumps"]
        let number = allPumps.count

        for i in 1..<number 
            let pumpName = pumpsJSON["Pumps"][i]["name"].stringValue
            self.pumpNames.append(pumpName)

            self.arrayData.append(cellData(cell : i, text : pumpName, image: #imageLiteral(resourceName: "ln-bkg")))

        
        //Reload the tableView
        DispatchQueue.main.async 
            self.tableView.reloadData()
        
    

注意:您已将for loop1..&lt;number 开头,因此您将忽略数组的第一条记录,因为数组以0 索引开头。

【讨论】:

有效!非常感谢。是的,从 1 开始的 for 循环,因为 FirstCell 是 0 (arrayData = [ cellData(cell : 0, text : annotationTitle, image: #imageLiteral(resourceName: "ln-bkg"))]) 所以我继续 1。为了未来实现,是否可以每 X 秒重新加载一次 tableView(以及 JSON 数据),以便用新数据更新表? 好的,现在我明白为什么我不能使用 1.. @Fid 欢迎朋友 :)

以上是关于Swift:动态地将 JSON 添加到表单元格数组中的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式将视图添加到表视图中的单元格

Swift动态表格单元格高度[重复]

动态地将单元格添加到分组的 uitableview 并以编程方式适应滚动

涉及 JSON 解析以及静态和动态 UITableView 单元格的 Swift3 项目 - 使其更加面向对象

AJAX如何动态地将行添加到表中

是否可以仅使用 CSS 和单元格的 td 值动态地将边框分配给 html 表格?