用集合视图中的数据填充表视图

时间:2019-04-14 14:02:28

标签: swift uitableview uicollectionview uicollectionviewcell

我需要在集合视图中的许多表视图中填充数据。随着数据的传入,表视图的数量正在增长,这是未知的。每个表视图都位于uicollectionview单元格中。水平滑动。当前,数据正在第一个表中显示,在第三和第五个表中显示,依此类推。并且所有数据都是相同的。我希望仅首先显示数据。当我滑动到下一张表时,该表将在其中显示新数据。

编辑:

我可以在其他表视图中显示数据。然后在仍然有数据的表视图之间移动,这就是我想要的。

它跳过所有其他表视图并显示数据,我不知道为什么!

I can display data in the first(orange) tableview, but next data is displayed in the third(light brown), and not red.

更新

indexPath.item也发生了一些奇怪的事情: 当我在第一个单元格中时,它将显示indexPath.item = 0,当我在中间单元格中时,它将显示indexPath.item =2。

更新 As you can see the indexPath.item is different and all messed up compared to the MenuBar, I want them to have equal

正如您所看到的,indexPath.item与MenuBar相比有所不同并且全部弄乱了,我希望它们具有相同的

更新

解决了以下gif问题:

collectionView.isPrefetchingEnabled = false

现在数据已在第一个表视图中正确显示,并且当我切换到下一个表视图时,新数据将显示在该表视图中,但是随后重复出现,因此第3个与第1个相同,第4个与第2个相同。 / p>

使用代码更新: MenuBar(带有单元格的顶部Uicollection视图,带圆圈的1,2,3..etc图像)

class MenuBar: UIView, UICollectionViewDataSource, UICollectionViewDelegate, UICollectionViewDelegateFlowLayout {

NewReceiveViewController

class NewReceiveViewController: UICollectionViewController, UICollectionViewDelegateFlowLayout {
  var myData: [[UInt8]] = [] // will this be ReceivedArrays?
....
  override func viewDidLoad() {
    super.viewDidLoad()
  collectionView.register(ReceivedCell.self, forCellWithReuseIdentifier: cellId)

  override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {

    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: cellId, for: indexPath) as! ReceivedCell

    cell.backgroundColor = UIColor.lightGray // just to see where the cell is
    cell.configure(with: myData[indexPath.row])

    return cell

 class ReceivedCell: UICollectionViewCell {
   //vars for the data
   var recievedArrays: [[UInt8]] = []  //receivedbytes array is put    into array here
   var receivedBytes: [UInt8] = []{    //receieved bytes
      didSet {
        tableView.reloadData()

      }

var data: [UInt8] = [] // will this be receieved bytes?

func configure(with data: UInt8) {

    self.data = [data]
    self.tableView.dataSource = self
}

extension ReceivedCell: UITableViewDelegate, UITableViewDataSource {

 func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

    return recievedArrays.count //counting and returning how many receivedbytes arrays in receivedArrays
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    let cell = tableView.dequeueReusableCell(withIdentifier: tableViewCell, for: indexPath)
...
// table cells set here
// I'm a bit unsure how to set up the cell with self.data
...
return cell

1 个答案:

答案 0 :(得分:1)

您可以通过将每个单元格设置为其自己的tableView的委托来完成此操作。

class MyVC: UICollectionViewDataSource {

     var myData: [DataType]! // You MUST populate this value with your data before you start getting delegate calls. You should probably set this as soon as you initialize this view.

     func collectionView(_ collectionView: UICollectionView, cellForRowAt indexPath: IndexPath) -> UICollectionViewCell {
          // Configure collection view cell
          cell.configure(with: myData[indexPath.row]
          return cell
     }

}

class MyCell: UICollectionViewCell, UITableViewDelegate {

     @IBOutlet var tableView: UITableView!
     var data: DataType!

     func configure(with data: DataType) {
          self.data = data
          self.tableView.dataSource = self
     }

     func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
          // Set up table cell using self.data
          return cell
     }

}