如何访问嵌入在主UIViewController中的父collectionViewCell中的collectionView?
我的主ViewController是一个UICollectionView,它包含一个名为BannerCell的UICollectionViewCell。 BannerCell有一个collectionView,其中包含3个单元格:
在PostsCell中,有一个包含帖子的单元格的集合视图。
我想访问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并且您可以执行您想要的操作