UICollectionView 无法在 ViewController.swift 中使用 IBOutlets

UICollectionView Can't use IBOutlets in ViewController.swift

我按照随附的指南创建静态 UICollectionView,但现在我想向每个单元格添加按钮并更改按钮上的文本,例如。我无法执行此操作并收到错误 "UIButton is invalid. Outlets cannot be connected to repeating content." 如何解决此问题并在不离开 ViewController 的情况下将 IBOutlets 与单元格中的对象一起使用?

如果我需要离开 ViewController 请详细描述过程,因为我是初学者,对不同的观点不太了解 类。

谢谢!!

您应该创建 UICollectionViewCell 的子 class,并在 class 上添加您的 IBOutlets,而不是按钮和视图控制器之间的出口。

class MyCollectionViewCell: UICollectionViewCell {
    @IBOutlet var myButton: UIButton!
}

然后,在 Interface Builder 中,将此子 class 设置为单元格的 class(在身份检查器窗格中)。

然后您应该能够创建从按钮到电池的插座连接。

我希望这已经足够清楚了。如果没有,请告诉我!

示例代码

class MyCollectionViewCell: UICollectionViewCell {
    @IBOutlet var myButton: UIButton!
}

class MyViewController: UIViewController, UICollectionViewDataSource {
    @IBOutlet var myCollectionView: UICollectionView!

    private var isMyButtonEnabled = true

    // Other view controller code

    func disableMyButton() {
        self.isMyButtonEnabled = false
        self.myCollectionView.reloadData()
    }

    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = ... as! MyCollectionViewCell // Get cell
        // Other cell setup

        cell.myButton.isEnabled = self.isMyButtonEnabled

        return cell
    }
}

为您的 collection 视图定义 class 如下:

class MyCollectionCell : UICollectionViewCell {
    @IBOutlet weak var likeButton: UIButton?
}

为 collection 单元格创建 xib 并为 collection 视图使用上面的自定义 class。

现在在您的视图控制器中定义 collection 视图并实现以下委托 UICollectionViewDataSource, UICollectionViewDelegate, UICollectionViewDelegateFlowLayout

class ViewController: UIViewController, UICollectionViewDataSource, 
         UICollectionViewDelegate, UICollectionViewDelegateFlowLayout {

    @IBOutlet var collectionView: UICollectionView!

    override func viewDidLoad() {
        super.viewDidLoad()
        let nib = UINib(nibName: "MyCollectionViewCell", bundle: nil)
        collectionView?.registerNib(nib, forCellWithReuseIdentifier: "myCell")
    }

    //UICollectionViewDelegateFlowLayout methods
    func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumLineSpacingForSectionAtIndex section: Int) -> CGFloat
    {
        return 4;
    }

    func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumInteritemSpacingForSectionAtIndex section: Int) -> CGFloat
    {
        return 1;
    }   

    //UICollectionViewDatasource methods
    func numberOfSectionsInCollectionView(collectionView: UICollectionView) -> Int 
    {
        return 1
    }

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

    func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
        var cell = 
        collectionView.dequeueReusableCellWithReuseIdentifier(reuseIdentifier, forIndexPath: indexPath) as MyCollectionCell
        cell.likeButton.setTitle("myTitle", for: .normal)
        cell.likeButton.tag = indexPath.row
        cell.likeButton.addTarget(self, action: #selector(mainButton:), forControlEvents: .TouchUpInside)
        return cell
    }

    @IBAction func mainButton(sender: UIButton) {
      println(sender)
      // use button tag to find out which button is clicked.
    }
}

在上面的代码中,重要的方法是 func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell,您可以在其中为按钮设置标签,然后使用该标签找出按下了哪个按钮,并使用该 ID 找出数据源或要执行的操作.