使用字典值在 tableView 内填充 collectionView 的标签

Posted

技术标签:

【中文标题】使用字典值在 tableView 内填充 collectionView 的标签【英文标题】:Using dictionary values to populate collectionView's label inside of a tableView 【发布时间】:2018-06-25 12:41:14 【问题描述】:

所以我在tableView 中有一个collectionView。我想使用我的数组中的值来填充每个collectionViewCell 中的每个标签文本。如果我在collectionViewcellForItemAt 中打印下面的代码,我会得到下面的(见图)(显然索引超出范围):

Print(array[indexPath.row].details.values)

所以使用照片中的示例,我怎样才能得到以下信息:

外表ViewCell (1) 集合视图单元格 (1) 标签 - “1” 集合视图单元格 (2) 标签 - “3” 集合视图单元格 (3) 标签 - “5” 外表ViewCell (2) 集合视图单元格 (1) 标签 - “7”

你也可能注意到它的数组没有按顺序排列,是否可以重新排序:

[“1”:1,“2”:3,“3”:5]

非常感谢任何帮助,非常感谢!

我的阵列:

【问题讨论】:

你的意思是数组是一个字典数组,比如 let array = [["2":3,"1": 1,"3":5,"1":7]]。 ? 数组是[["2": 3, "1": 1, "3": 5]], [["1":7]],所以第一个tableViewCell应该有3 collectionViewCells 其各自的标签文本为 1、3、5(注意我希望它们被重新排序)。第二个 tableViewCell 应该有 1 个 collectionViewCell,其标签为 7。非常感谢! 【参考方案1】:

根据您的要求,这里是代码

import UIKit

class ViewController: UIViewController,UITableViewDelegate,UITableViewDataSource 

    // Global Variable
    var tableView: UITableView!
    var dataArray = [["2": 3, "1": 1, "3": 5], ["1":7]]

    override func viewDidLoad() 
        super.viewDidLoad()

        tableView = UITableView(frame: self.view.bounds)
        tableView.delegate = self
        tableView.dataSource = self
        self.view.addSubview(tableView)

        tableView.register(TableViewCell.self, forCellReuseIdentifier: "TableViewCell")
    

    func numberOfSectionsInTableView(tableView: UITableView) -> Int 
        return 1
    

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
        return dataArray.count
    

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
            let cell: TableViewCell = tableView.dequeueReusableCell(withIdentifier: "TableViewCell", for: indexPath as IndexPath) as! TableViewCell
     //   Passing data to cellection cell
            cell.cellData = dataArray[indexPath.row]
            cell.backgroundColor = UIColor.groupTableViewBackground
            return cell


    



class TableViewCell: UITableViewCell, UICollectionViewDataSource, UICollectionViewDelegate 

    var collectionView: UICollectionView!
    var cellData = [String: Int]()

    override init(style: UITableViewCellStyle, reuseIdentifier: String?) 
        super.init(style: style, reuseIdentifier: reuseIdentifier)

        let layout = UICollectionViewFlowLayout()
        layout.scrollDirection = UICollectionViewScrollDirection.horizontal

        collectionView = UICollectionView(frame: self.bounds, collectionViewLayout: layout)
        collectionView.delegate = self
        collectionView.dataSource = self
        collectionView.register(CollectionCell.self, forCellWithReuseIdentifier: "CollectionViewCell")
        collectionView.backgroundColor = UIColor.clear

        self.addSubview(collectionView)
    

    required init?(coder aDecoder: NSCoder) 
        super.init(coder: aDecoder)
    

    // MARK: UICollectionViewDataSource
    func numberOfSectionsInCollectionView(collectionView: UICollectionView) -> Int 
        return 1
    


    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int 
        return cellData.count
    

    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell 
        let cell: CollectionCell = collectionView.dequeueReusableCell(withReuseIdentifier: "CollectionViewCell", for: indexPath as IndexPath) as! CollectionCell
        cell.textLable.text = String(Array(cellData)[indexPath.row].value) // Please check here is some casting 
        cell.backgroundColor = .black
        return cell
    


class CollectionCell: UICollectionViewCell 

    let textLable: UILabel = 
        let label = UILabel(frame: CGRect(x: 0, y: 0, width: 20, height: 20))
        label.textColor = .white
        label.translatesAutoresizingMaskIntoConstraints = true
        label.textAlignment = .center
        return label
    ()

    override init(frame: CGRect) 
        super.init(frame: frame)
        setupLayout()
    

    private func setupLayout() 
        addSubview(textLable)
    

    required init?(coder aDecoder: NSCoder) 
        fatalError("init(coder:) has not been implemented")
    

希望它能解决你的问题。

结果

【讨论】:

嗨,rizwan,非常感谢!我目前不在我的电脑附近,但它看起来很完美!一旦我测试了它,我会为你投票!最后一件事,是否可以重新排序数组,使第一个 tableViewCell 是 1、3、5 而不是 3、1、5?再次感谢你? 很高兴它对您有所帮助,重新排序只需更改您想要的数据数组方式,例如 [["1":7],["2": 3, "1": 1, "3 ": 5]]. 对不起,我的意思是我可以重新排序数组值,所以它是 [[“1”: 1, “2”: 3, “3”: 5]]。基本上每个字典的第一个值是1、2、3?如果不手动进行,是否有一些代码或代码可以使这成为可能?请注意,这些值不需要是字符串,当我从服务器检索它们时,我可以将它们转换为 Int 值。谢谢! 对于更改顺序,您必须根据需要对数据进行排序,您可以根据值和排序规则对数组进行排序,还可以根据键或值对字典进行排序***.com/questions/24090016/… 和第二个喜欢是***.com/questions/31088974/… 嗨,rizwan,它运行良好,再次感谢您!你帮了大忙! ?【参考方案2】:

如果我理解正确,你有一个数组,格式有点奇怪

array = [[["2": 3, "1": 1, "3": 5]], [["1":7]]]

由于集合视图位于表格视图中,我假设您已经实现了NSTableViewDataSource,然后您可以将表格视图的当前行保存为 tableView: viewFor: 中的属性,从而获取要使用的数组财产。由于您在数组中有一个数组,我们需要获取该数组中的第一项,然后过滤该键与当前 indexPath.row 匹配的项(字典)

let row = String(indexPath.row + 1)
let item = array[currentTableViewRow][0].filter $0.key = row
if !item.isEmpty 
     label.text = item.value

【讨论】:

您好 Joakim,非常感谢您的回复!稍后当我靠近我的计算机时,我会对其进行测试,如果它有效,我会给你一个赞!再次感谢? 嗨 Joakim,真的很抱歉,但请您解释一下“currentTableViewRow”的来源?谢谢! 是你在我文中提到的table view数据源方法中设置的属性。【参考方案3】:

将其转换为 Array 用这个:

Array(array[indexPath.row].details.values)

并打印这个值你得到正确的数组以正确的顺序。

希望对你有帮助

谢谢。

【讨论】:

以上是关于使用字典值在 tableView 内填充 collectionView 的标签的主要内容,如果未能解决你的问题,请参考以下文章

在 tableview 中填充数组字典的高效和干净的方法

使用 NSMutableDictionary 和数组填充单元格的 TableView

使用字典数据填充 UITableView (Swift)

从字典数组 Swift 中填充 UITableView

在iOS中使用Firebase / Firestore填充tableView时遇到麻烦

获取 JSON 数据以从数组中填充 TableView