UIView 上的 CollectionView 单元实例(在委托之外)不工作 swift 5

CollectionView cell instance (Outside of delegate) on UIView is not working swift 5

我有一个名为 HorizontalMenuCollectionView 的视图,我正在其上加载集合视图。我可以通过将它与任何视图(来自身份检查器)挂钩来使用它。

一切正常。但是现在我想在开始加载此视图时设置第一个项目单元格的背景颜色。但是单元格背景颜色没有改变。我在这里错过了什么?

这是我尝试设置项目单元格背景颜色的函数

func selectinitialCell() {
    let selectedIndexPath = IndexPath(item: 0, section: 0)
    let cell = menuCollectionView.dequeueReusableCell(withReuseIdentifier: "HorizontalMenuCollectionViewCell", for: selectedIndexPath) as! HorizontalMenuCollectionViewCell
    cell.backgroundColor = UIColor.blue.withAlphaComponent(0.05)
    menuCollectionView.reloadData()
}

这是完整的 HorizontalMenuCollectionView:

import UIKit

protocol HorizontalMenuCollectionViewDelegate {
    func didSelectItemAtIndexPath(title: String)
}

class HorizontalMenuCollectionView: UIView {
    
    var horizontalMenuCollectionViewDelegate : HorizontalMenuCollectionViewDelegate!
    @IBOutlet weak var menuCollectionView: UICollectionView!
    var objectArray = [String?]()
    var isFirstTimeGettingCalled = true
    
    //This initializer will call from code
    override init(frame: CGRect) {
        super.init(frame: frame)
        self.initialization()
    }
    
    //This initializer will call from XIB
    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        self.initialization()
    }
    
    func initialization() {
        let view = Bundle.main.loadNibNamed("HorizontalMenuCollectionView", owner: self, options: nil)![0] as? UIView
        view?.frame = self.bounds
        self.autoresizingMask = [.flexibleHeight, .flexibleWidth]
        self.addSubview(view!)
        registerNib()
        selectinitialCell()
    }
    
    func selectinitialCell() {
        let selectedIndexPath = IndexPath(item: 0, section: 0)
        let cell = menuCollectionView.dequeueReusableCell(withReuseIdentifier: "HorizontalMenuCollectionViewCell", for: selectedIndexPath) as! HorizontalMenuCollectionViewCell
        cell.backgroundColor = UIColor.blue.withAlphaComponent(0.05)
        menuCollectionView.reloadData()
    }
    
    func registerNib() {
        let horizontalMenuCollectionViewCellNib = UINib(nibName: "HorizontalMenuCollectionViewCell", bundle: nil)
        menuCollectionView.register(horizontalMenuCollectionViewCellNib, forCellWithReuseIdentifier: "HorizontalMenuCollectionViewCell")
    }
}

extension HorizontalMenuCollectionView: UICollectionViewDelegate, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout {
    func numberOfSections(in collectionView: UICollectionView) -> Int {
        return 1
    }
    
    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return objectArray.count
    }
    
    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAt section: Int) -> UIEdgeInsets {
        return UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0)
    }
    
    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumInteritemSpacingForSectionAt section: Int) -> CGFloat {
        return 0
    }
    
    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumLineSpacingForSectionAt section: Int) -> CGFloat {
        return 0
    }
    
    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
        let text = NSAttributedString(string: objectArray[indexPath.row]!)
        return CGSize(width: text.size().width + 80, height: self.bounds.height)
    }
    
    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "HorizontalMenuCollectionViewCell", for: indexPath) as! HorizontalMenuCollectionViewCell
        cell.titleLabel.text = objectArray[indexPath.row]!
        
        let backgroundView = UIView()
        backgroundView.backgroundColor = UIColor.blue.withAlphaComponent(0.05)
        cell.selectedBackgroundView = backgroundView
        
        return cell
    }
    
    func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
        menuCollectionView.scrollToItem(at: indexPath, at: .centeredHorizontally, animated: true)
        horizontalMenuCollectionViewDelegate.didSelectItemAtIndexPath(title: objectArray[indexPath.row]!)
    }
}

回答我正在访问它的视图控制器

import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var horizontalMenuCollectionView: HorizontalMenuCollectionView!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        horizontalMenuCollectionView.horizontalMenuCollectionViewDelegate = self
        horizontalMenuCollectionView.objectArray = ["A", "AA", "AAA", "AAAA", "AAAAA"]
    }
}

extension ViewController: HorizontalMenuCollectionViewDelegate {
    func didSelectItemAtIndexPath(title: String) {
        print("\(title)")
    }
}

完整样本 project is here.

将您的 func selectinitialCell() 替换为以下函数。

func selectinitialCell() {
    menuCollectionView.performBatchUpdates({
        self.menuCollectionView.reloadData()
    }) { (finish) in
        if finish{
            let selectedIndexPath = IndexPath(row: 0, section: 0)
            self.menuCollectionView.selectItem(at: selectedIndexPath, animated: false, scrollPosition: .left)
        }
    }
}