在 Swift 中的表格视图中填充数据的问题

Posted

技术标签:

【中文标题】在 Swift 中的表格视图中填充数据的问题【英文标题】:Issue in populating data in table view in Swift 【发布时间】:2018-03-01 17:06:56 【问题描述】:

我通过 segue 方法将一个 Any 类型的数组从一个视图控制器传递到我的表视图控制器。我有三个数组,我首先制作它的字典,然后通过 segue 将该字典传递给下一个视图控制器。我将该数组附加到另​​一个数组中。然后我将该附加数组传递给 cellForRow 方法以在标签中填充我的数据。但是当在单元格中打印标签的值时,它给出了 nil。我很困惑为什么它没有从数组中传递值?代码中没有错误。 我的代码是这样的,

在我的第一个视图控制器中,我将我的值附加到这样的数组中,

        ItemName.append(itemName!)
        ItemPrice.append(result)
        ItemDescrition.append(description)

像这样制作它的字典并将其传递给segue,

 let itemData : [String : Any] = [

         "itemName": ItemName,
         "itemPrice": ItemPrice,
         "itemDescrip": ItemDescrition

    ]

    self.performSegue(withIdentifier: "GoToOrder", sender: itemData)

segue方法是这样的,

 override func prepare(for segue: UIStoryboardSegue, sender: Any?) 

            if segue.identifier == "GoToOrder"
            let destination = segue.destination as! UINavigationController
                let target = destination.topViewController as! CartViewController
                target.itemData = sender as! Dictionary
            

        

在我的第二个视图控制器中,我从字典中获取值并附加到另一个数组,该数组我传递给表格视图中的 cellForRow 方法,

 var itemData : [String : Any]! = nil
 let resultPrice = itemData["itemPrice"]
    print(resultPrice)
    let itemName = itemData["itemName"] as Any
    print(itemName)
    let itemDescrip = itemData["itemDescrip"] as Any
    nameArray.append(itemName)
    descripArray.append(itemDescrip)
    priceArray.append(resultPrice)

我在表视图委托中传递该数组,

 func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int

    return nameArray.count

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell


    let cell = tableView.dequeueReusableCell(withIdentifier: "cell") as! CartTableViewCell

    cell.dishTitleLbl.text = nameArray[indexPath.row] as? String
    print(cell.dishTitleLbl.text)
    cell.priceLbl.text = priceArray[indexPath.row] as? String
    print(cell.priceLbl.text)
    cell.dishDetailLbl.text = descripArray[indexPath.row] as? String
    print(cell.dishDetailLbl.text)
   // count = cell.priceLbl.text!
    print(count)
    cell.totalLbl.text = "1"
    cell.selectionStyle = .none
    cell.backgroundColor = UIColor.clear
    cell.delegate = self
    return cell

如何从单元格标签中的该数组中获取值?

【问题讨论】:

强烈建议创建一个自定义结构作为数据源,而不是多个数组。它使事情如此变得容易得多。 ` var itemData : [String : Any]! = nil ` 是全局变量还是局部变量?不要使用与全局变量名相同的局部变量。 我同意@vadian 你应该考虑制作一个数据对象(不一定是struct)并制作该对象的价格和描述属性。然后只需创建该对象类型的单个数组。您可以按数组的任何属性(例如价格)对数组进行排序。在您的配置中使用带有数据源的字典可能会变得不必要地复杂。 var itemData : [String : Any]! = 零是。全局变量。 @SidMhatre 【参考方案1】:

我会以不同的方式处理这个问题。首先,我将创建一个名为 Item 的对象来存储您的所有项目数据。然后我会创建一个dataSource,您可以使用它从应用程序中的任何位置调用数据,如下所示:

class Item : NSObject 
    var name : String
    var price : [Int] // an array of prices
    var  description : String

    init(_ name: String, _ price : [Int], _ description : String) 
        self.name = name
        self.price = price
        self.description = description
    



class ItemDataSource : NSObject 
    var items = [Item]()
    static let sharedInstance = ItemDataSource()
    private init() 

任何时候您需要创建一个新的Item,您都可以这样做:

let item = Item(“name”,[1234],”description”)
ItemDataSource.sharedInstance.items.append(item)

然后在你的 tableView numberOfRowsInSection 你这样称呼:

ItemDataSource.sharedInstance.items.count

您可以在cellForRowAt 中获取信息,例如:

cell.nameLabel.text = ItemDataSource.sharedInstance.items[indexPath.row].name

【讨论】:

为什么是可选属性?请写一个初始化器! 我必须为结构创建一个单独的类? @杰克 在我的场景中,用户可以根据需要添加任意数量的数据,这个场景对我有好处吗? 不,您可以使用 structclass,是的,ItemDataSource.sharedInstance.items 是一个与您当前正在做的非常相似的数组。 单独我必须为它上课?以及您如何在此处分配值 let item = Item() item.name = “name” ,其中的名称是什么? @杰克

以上是关于在 Swift 中的表格视图中填充数据的问题的主要内容,如果未能解决你的问题,请参考以下文章

Swift - 表视图未填充数据但未显示错误

解析对象数组并填充表格视图单元格 Swift

在 SWIFT 的表视图中填充自定义单元格时出错

独立填充集合视图的每个部分 Swift

如何填充表格视图,而不是表格视图控制器?

在 Swift 中使用 JSON 对象填充表视图