【问题标题】:Dynamic CollectionView depends on TableViewCell Values in SWIFT 4.0动态 CollectionView 依赖于 SWIFT 4.0 中的 TableViewCell 值
【发布时间】:2018-03-21 02:52:23
【问题描述】:

刚开始使用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。

【问题讨论】:

    标签: ios json swift xcode storyboard


    【解决方案1】:

    在将 JSON 序列化为数组之后,您需要对数据进行排序

    您的数组数据

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

    排序数组 = ["3D": ["12:00", "14:00"], "2D": ["15:00", "17:00", "21:00"]]

    TableView 单元数:2

    Tableview cellIndex 0 = 2 的 CollectionView 单元数

    Tableview cellIndex 1 = 3 的 CollectionView 单元数

    将此应用到您的 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!
    }
    

    故事板

    输出

    【讨论】:

    • 您好,感谢您的回答。对不起,这可能被误解了。问题不在于我的数据,而在于如何将数据动态追加到 CollectionView 中
    • 是的,类似的,我会试试你的代码和用户界面。非常感谢,伙计:D
    • 一直按照你的方式行事,但遗憾的是 tableview 和 collectionview 值没有显示在我的 UI 中:( @Britto
    • 您目前的问题是什么?首先,您尝试在不包含集合视图的情况下加载表格视图,并查看它是否有效
    • 抱歉已修复。但我想问一下,你的标签如何在collectionviewcell中水平放置?而我的总是垂直的
    猜你喜欢
    • 1970-01-01
    • 2016-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多