UICollectionView不能在ViewController.swift中使用IBOutlets

时间:2018-10-05 21:19:30

标签: ios swift uicollectionview iboutlet

我按照随附的指南创建了静态UICollectionView,但是现在我想向每个单元格添加按钮并更改按钮上的文本。我无法执行此操作,并收到错误“ UIButton无效。插座无法连接到重复内容”。如何解决此问题,并在不离开ViewController的情况下对单元格中的对象使用IBOutlet?

如果我需要离开ViewController,请以我为初学者并且对不同的视图类不太了解的方式来详细描述该过程。

谢谢!

2 个答案:

答案 0 :(得分:2)

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

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

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

Identity inspector

然后您应该能够从按钮到单元格建立插座连接。

Adding outlet connection

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

示例代码

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
    }
}

答案 1 :(得分:0)

为您的收藏夹视图定义类,如下所示:

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

为收集单元创建xib,并使用以上自定义类进行收集视图。

现在,在视图控制器中定义集合视图并实现以下委托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来查找要执行的数据源或操作。 / p>