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 loop
以1..<number
开头,因此您将忽略数组的第一条记录,因为数组以0
索引开头。
【讨论】:
有效!非常感谢。是的,从 1 开始的 for 循环,因为 FirstCell 是 0 (arrayData = [ cellData(cell : 0, text : annotationTitle, image: #imageLiteral(resourceName: "ln-bkg"))]) 所以我继续 1。为了未来实现,是否可以每 X 秒重新加载一次 tableView(以及 JSON 数据),以便用新数据更新表? 好的,现在我明白为什么我不能使用 1..以上是关于Swift:动态地将 JSON 添加到表单元格数组中的主要内容,如果未能解决你的问题,请参考以下文章
动态地将单元格添加到分组的 uitableview 并以编程方式适应滚动