如何访问嵌入在主UIViewController中的父collectionViewCell中的collectionView?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何访问嵌入在主UIViewController中的父collectionViewCell中的collectionView?相关的知识,希望对你有一定的参考价值。

如何访问嵌入在主UIViewController中的父collectionViewCell中的collectionView?

我的主ViewController是一个UICollectionView,它包含一个名为BannerCell的UICollectionViewCell。 BannerCell有一个collectionView,其中包含3个单元格:

  1. 标题细胞
  2. 图像细胞
  3. 帖子细胞

在PostsCell中,有一个包含帖子的单元格的集合视图。

enter image description here

我想访问postCell中的集合视图,但我似乎无法通过委托获取此collectionView的引用。

import UIKit

protocol HomeBannerPostsCellDelegate: class {
  func homeBannerPostsCellDelegateMethod1(enabled: Bool)
}

class HomeBannerHeaderPostsCollectionCell: UICollectionViewCell {
   @IBOutlet weak var bannerPostsCollectionView: UICollectionView!
   var delegate: HomeBannerPostsCellDelegate?
}

extension HomeBannerHeaderPostsCollectionCell : UICollectionViewDataSource, UICollectionViewDelegateFlowLayout {
  func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
      let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "HomeBannerHeaderPostCollectionCell", for: indexPath) as! HomeBannerHeaderPostCollectionCell
      cell.backgroundColor = UIColor.red

      if(indexPath.item==1 || indexPath.item==3 ){
          cell.backgroundColor = UIColor.blue
          return cell
      }
      return cell
  }

  func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
    return 4
  }

  func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
    let screenWidth = UIScreen.main.bounds.width
    let frameHeight = screenWidth*0.10
    return CGSize(width: screenWidth*0.75, height: frameHeight)
  }
}

我已经可以获得HomeBannerPostsCellDelegate来运行在主控制器中打印出一行的方法。

   if(bannerCellReuseIdentifier == widgets[indexPath.item]){
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: bannerCellReuseIdentifier, for: indexPath) as! HomeBannerCollectionCell
        cell.backgroundColor = UIColor.lightGray
        cell.delegate=self
        cell.bannerPostsDelegate=self
        self.bannerPostsCollectionView=cell.bannerPostsCollectionView
        return cell
    }

在ViewDidLoad()方法中

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.

        // This view controller itself will provide the delegate methods and row data for the table view.
    collectionView.delegate = self
    collectionView.dataSource = self

    // Register XIB for Supplementary View Reuse
    let XIB = UINib.init(nibName: "SectionHeader", bundle: Bundle.main)
    collectionView.register(XIB, forSupplementaryViewOfKind: UICollectionElementKindSectionHeader, withReuseIdentifier: HeaderIdentifier)

    let layout = StickyHeadersCollectionViewFlowLayout()
    collectionView.setCollectionViewLayout(layout, animated: true)
    collectionView.backgroundColor = UIColor.white

    collectionView.contentInset = UIEdgeInsets(top: -collectionView.bounds.width * 0.20 * 2, left: 0, bottom: 0, right: 0)

    self.homeBannerPostsCellDelegateMethod1(enabled: true)

    setTimer()

}

我正在尝试使用setTimerMethod使PostsCollectionView旋转

 func setTimer() {
    let _ = Timer.scheduledTimer(timeInterval: 3.0, target: self, selector: #selector(autoChangeBanner), userInfo: nil, repeats: true)
}

var bannerPostIndex = 0
@objc func autoChangeBanner() {
    NSLog("autoChangeBanner")
    let indexPath = IndexPath(item: bannerPostIndex, section: 0)
    self.bannerPostsCollectionView?.scrollToItem(at: indexPath, at: .centeredVertically, animated: true)
    bannerPostIndex=bannerPostIndex+1
    if(bannerPostIndex>3){
        bannerPostIndex=0
    }
}

但bannerPostsCollectionView是零。

有什么办法可以将bannerPostsCollectionView的引用发送回MainController吗?

提前致谢。

答案

在主要控制器上单元格确实选择委托方法,您将检查点击单元格是否是带横幅的单元格。

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
        let cell = collectionView.dequeueReusableCellWithReuseIdentifier(reuseIdentifier, forIndexPath: indexPath)

        if let bannerCell = cell as? HomeBannerHeaderPostsCollectionCell {
              bannerCell.bannerPostsCollectionView ....
              return
          }

        //And here you do whatever you want for the other cells
    }

如果是这样,您将把单元格转换为HomeBannerHeaderPostsCollectionCell,然后您将访问它的变量cell.bannerPostsCollectionView并且您可以执行您想要的操作

以上是关于如何访问嵌入在主UIViewController中的父collectionViewCell中的collectionView?的主要内容,如果未能解决你的问题,请参考以下文章

从嵌入式子UIViewController中获取Parent ViewController

无法从主 UIViewController 访问嵌入式 UICollectionView

使用 segues 在 NavigationController 中嵌入 UIViewController

在主 UiViewController 中动态声明子 UiViewController

嵌入在 UIViewController 中的 UIHostingController - 如何从外部更新 @State?

如何在嵌入 UIViewController 的 UITableView 中直观地创建和使用静态单元格