动态 CollectionView 依赖于 SWIFT 4.0 中的 TableViewCell 值

Dynamic CollectionView depends on TableViewCell Values in SWIFT 4.0

刚开始使用 swift,我遇到了我自己无法解决的问题。

所以在这里,我得到了一个结构如下的视图

ViewController Structure

想象一下我有一个这样的 json 数组:

{           
    "SCREENTIME": "15:00",
    "FORMAT": "2D"      
},
{
    "SCREENTIME": "17:00",
    "FORMAT": "2D"      
},
{
    "SCREENTIME": "21:00",
    "FORMAT": "2D"      
},
{
    "SCREENTIME": "12:00",
    "FORMAT": "3D"      
},
{
    "SCREENTIME": "14:00",
    "FORMAT": "3D"      
}

'FORMAT' 变量将放置在 TableView 中,而 'SCREENTIME' 将放置在 CollectionView 中。

更有可能需要这样的结果

Result be like this

如何通过TableViewCell将数据动态追加到CollectionView中?一直在寻找许多方法和许多源代码,但其中大多数是静态数据和 swift 2/3 而我正在使用 swift 4.

您需要对数据进行排序.. 在将 JSON 序列化为 Array

之后

你的数组数据

let array = [
        [
            "SCREENTIME": "15:00",
            "FORMAT": "2D"
],
         [
            "SCREENTIME": "17:00",
            "FORMAT": "2D"
],
         [
            "SCREENTIME": "21:00",
            "FORMAT": "2D"
],
         [
            "SCREENTIME": "12:00",
            "FORMAT": "3D"
],
         [
            "SCREENTIME": "14:00",
            "FORMAT": "3D"
]]

正在排序

var sortedArray : [String:[String]] = [:]
for dictionary in array {
if let key = dictionary["FORMAT"]{
    if let screenTime = dictionary["SCREENTIME"] {
        if sortedArray[key] != nil {
            sortedArray[key]?.append(screenTime)
        }else{
            sortedArray[key] = [screenTime]
        }
    }
}

}

预计输出

print("Sorted Array = \(sortedArray)")
print("Number of TableView Cells      : \(sortedArray.count)")
for (index, key) in sortedArray.keys.enumerated() {
  print("Number of CollectionView Cells for Tableview cellIndex \(index) = \(sortedArray[key]!.count)")
}

Sorted Array = ["3D": ["12:00", "14:00"], "2D": ["15:00", "17:00", "21:00"]]

Number of TableView Cells : 2

Number of CollectionView Cells for Tableview cellIndex 0 = 2

Number of CollectionView Cells for Tableview cellIndex 1 = 3

将此应用于您的 UI - 请参考此示例代码

ViewController.swift

class ViewController: UIViewController,UITableViewDataSource {

 var sortedArray : [String:[String]] = [:]

 override func viewDidLoad() {
    tableView.dataSource = self
    let array = [ ["SCREENTIME": "15:00","FORMAT": "2D"],["SCREENTIME": "17:00","FORMAT": "2D"],["SCREENTIME": "21:00","FORMAT": "2D"],["SCREENTIME": "12:00","FORMAT": "3D"],["SCREENTIME": "14:00","FORMAT": "3D"]]

    for dictionary in array {
        if let key = dictionary["FORMAT"]{
            if let screenTime = dictionary["SCREENTIME"] {
                if sortedArray[key] != nil {
                    sortedArray[key]?.append(screenTime)
                }else{
                    sortedArray[key] = [screenTime]
                }
            }
        }
    }
}

 @IBOutlet weak var tableView: UITableView!

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

 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "TableViewCell") as! TableViewCell
    let key = Array(sortedArray.keys)[indexPath.row]
    cell.labelShowtype.text = key
    cell.loadCollectionView(array: sortedArray[key]!)
    return cell
 }

}

自定义 TableView 单元格

class TableViewCell: UITableViewCell,UICollectionViewDataSource {
 @IBOutlet weak var labelShowtype: UILabel!
 @IBOutlet weak var collectionView: UICollectionView!
 var array = [String]()
 override func awakeFromNib() {
    self.collectionView.dataSource = self
 }
 func loadCollectionView(array:[String]) {
    self.array = array
    self.collectionView.reloadData()
 }
 func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
    return array.count
 }

 func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "CollectionViewCell", for: indexPath) as! CollectionViewCell
    cell.labelTime.text = self.array[indexPath.row]
    return cell
 }
}

自定义集合视图单元格

class CollectionViewCell: UICollectionViewCell {
  @IBOutlet weak var labelTime: UILabel!
}

故事板

输出