繁体   English   中英

相同的数据在 UITableView 和 UICollectionView 在 swift 4 的部分中重复

[英]Same data is repeating in sections in UITableView and UICollectionView in swift 4

我是 swift 的新手,正在开发一个应用程序,我在 UITableView 内部的 collectionView 中绑定数据,我在 UICollectionView 中发送数据(它们是图像),如多维数组

[[<UIImage: 0x600000292610>, {1280, 720}, <UIImage: 0x600000292bb0>, {1000, 563}, <UIImage: 0x600000292c50>, {2048, 1200}, <UIImage: 0x6000002926b0>, {1080, 675}, <UIImage: 0x600000292c00>, {1156, 577}, <UIImage: 0x60800028e650>, {322, 156}], [<UIImage: 0x60800028e290>, {1600, 840}, <UIImage: 0x60800028de30>, {1640, 878}, <UIImage: 0x600000294e10>, {322, 156}, <UIImage: 0x600000294d70>, {1917, 1080}, <UIImage: 0x600000295310>, {1311, 737}, <UIImage: 0x60800028dac0>, {258, 195}], [<UIImage: 0x600000295720>, {1601, 1281}, <UIImage: 0x600000295630>, {1600, 1341}, <UIImage: 0x60800028f500>, {1200, 919}, <UIImage: 0x600000296e90>, {4088, 2921}], [<UIImage: 0x608000290ae0>, {1600, 584}, <UIImage: 0x600000297160>, {1400, 1050}, <UIImage: 0x600000296b70>, {717, 476}, <UIImage: 0x608000290e50>, {2280, 1060}, <UIImage: 0x600000297390>, {1068, 427}, <UIImage: 0x608000291260>, {3200, 1600}, <UIImage: 0x608000290e00>, {258, 195}], [<UIImage: 0x608000291490>, {1300, 630}, <UIImage: 0x6080002914e0>, {512, 366}, <UIImage: 0x608000290bd0>, {1200, 628}], [<UIImage: 0x600000297b60>, {1200, 628}, <UIImage: 0x6000002972f0>, {1536, 1024}, <UIImage: 0x608000291b70>, {1540, 705}, <UIImage: 0x6000002985b0>, {1200, 676}, <UIImage: 0x60800009c4d0>, {443, 377}]]

我的问题是我看到第 0、1、2 节是唯一创建的,但是第 3 节的生成与第 0 节相同,

这是我在 collectionView 中的代码

func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        print("numberOfItemsInSection ******",self.imageArray[section].count,"********")
         return self.imageArray[section].count
    }

    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        if let cell: CollectionViewCell = collectionView.dequeueReusableCell(withReuseIdentifier: "collectionCell", for: indexPath) as? CollectionViewCell
        {
           // if(imageArray[indexPath.section].count>0){
                print("---> ",indexPath.section," --- item ->",indexPath.row)
                cell.imageView.image = imageArray[indexPath.section][indexPath.row]
            //}
            return cell
        }
        return UICollectionViewCell()
    }

    func numberOfSections(in collectionView: UICollectionView) -> Int {
        print("numberOfSections ******",self.imageArray.count,"********")
        return self.imageArray.count
    }

    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize{
        let size = CGSize(width: 120, height: 300)
        return size
    }

这是我的 tableView Controller

extension CompanyViewController: UITableViewDelegate, UITableViewDataSource {

    func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
        if self.sectionHeaderName.count>0 {
            print("*******",self.sectionHeaderName[section],"*******")
            return self.sectionHeaderName[section]
        }else{
            return ""
        }
    }

    //NUMBER OF SECTION WE WANT IN A TABLE
    func numberOfSections(in tableView: UITableView) -> Int {
        return self.sectionHeaderName.count
    }
    /*NUMNBER OF ROWS IN A SECTION*/
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 1
    }

    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
        return 80
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        if let cell = tableView.dequeueReusableCell(withIdentifier: "tableViewCell", for: indexPath) as? TableViewCell
        {

            return cell
        }
        return UITableViewCell()
    }
}

我在这里挣扎了两天,但找不到任何解决方案。 任何帮助,将不胜感激

TIA

您应该在 TableViewCell willDisplay设置数据源或委托

func setCollectionViewDataSourceDelegate(dataSourceDelegate: UICollectionViewDataSource & UICollectionViewDelegate, forRow row: Int) {
    collectionView.delegate = dataSourceDelegate
    collectionView.dataSource = dataSourceDelegate
    collectionView.reloadData()
}
override func tableView(tableView: UITableView,
    willDisplayCell cell: UITableViewCell,
    forRowAtIndexPath indexPath: NSIndexPath) {

    guard let tableViewCell = cell as? TableViewCell else { return }

    tableViewCell.setCollectionViewDataSourceDelegate(self, forRow: indexPath.row)
}

挠了3天终于找到答案了

我必须像这样从 cellForRowAt function 中的 TableView Extension 传递我的数据

cell.cellData = self.imageArray[indexPath.section]
return cell

在我定义 CollectionView 的 TableViewCell 中,我声明了变量

 var cellData = [UIImage]()

并使用相同的变量来获取所有集合视图函数中的图像

CellForItemAt需要从下面的数组中获取数据并使用行而不是项目和部分,因为当向上和向下滚动 tableView 时,图像可能会在单元格中随机显示或错误显示,因此使用indexPath.row可以防止图像的随机播放。

cell?.imageView.image = cellData[indexPath.row]

我需要补充的另一件事是

cell.collectionView.reloadData() 

因为 TableView 正在参考我的第一个数组索引而不是我传递的内容。

谢谢

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM