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

时间:2018-06-25 12:41:15

标签: ios arrays swift uitableview uicollectionview

因此,我在collectionView中有一个tableView。我想使用数组中的值来填充每个collectionViewCell中的每个标签文本。如果我在collectionView cellForItemAt中打印以下代码,则会得到以下内容(参见图片)(并且显然索引超出范围):

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

因此,使用照片中的示例,我如何获得以下信息:

  • 外部tableViewCell(1)
    • CollectionViewCell(1)
      • 标签-“ 1”
    • CollectionViewCell(2)
      • 标签-“ 3”
    • CollectionViewCell(3)
      • 标签-“ 5”
  • 外部tableViewCell(2)
    • CollectionViewCell(1)
      • 标签-“ 7”

您还可能注意到它的数组不整齐,是否有可能重新排序,所以它的:

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

我们非常感谢您的帮助,非常感谢!

我的阵列:

Data to display in label

3 个答案:

答案 0 :(得分:2)

根据您的要求,此处是代码

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")
    }
}

希望它能解决您的问题。

结果

enter image description here

答案 1 :(得分:0)

如果我对它的理解正确的话,那么你会有一个数组,格式有点奇怪,

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
}

答案 2 :(得分:-1)

将其转换为 Array

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

并打印此值您将以正确的顺序获得正确的数组。

希望它会对您有所帮助,

谢谢。