如何获取UICollectionView中每个选定单元格的按钮标题?

时间:2018-09-03 21:50:13

标签: swift uicollectionview uicollectionviewcell

我有一个按钮的collectionView,如下图所示。我希望能够选择多个这些单元格,然后将每个所选按钮的标题传递到字符串数组中。

UICollectionView - each cell has a button with a title

UICollectionView在WordViewController类中

class WordViewController: UIViewController, UICollectionViewDataSource, UICollectionViewDelegate, UICollectionViewDelegateFlowLayout

UICollectionViewCell位于它自己的文件中。

import UIKit

class WordCollectionViewCell: UICollectionViewCell {

@IBOutlet weak var wordView: UIButton!

@IBAction func buttonTapped(_ sender: UIButton) {
    if wordView.isSelected == true {
        wordView.isSelected = false
        wordView.backgroundColor = UIColor.blue
    }else {
        wordView.isSelected = true
        wordView.backgroundColor = UIColor.green
    }  
}

}

我对Swift还是很陌生,几天来我一直在努力寻找答案,但是我无法弄清楚。我怀疑我可能必须使用indexPathsForSelectedItems,但是我已经尝试过了,但无法正常工作。

func indexSelected () {
        let collectionView = self.collectionView
        let indexPath = collectionView?.indexPathsForSelectedItems?.first
        print(indexPath!)
        let cell = collectionView?.cellForItem(at: indexPath!) as? WordCollectionViewCell
        let data = cell?.wordView.currentTitle
        print(data!)

}

我不确定我设置CollectionView的方式是否存在根本性错误,或者是否与使用CollectionViewCells中的按钮有关。

任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:1)

这是您可以做到的一种方法。首先获取所选单元格的indexPaths。然后循环遍历indexPaths并获取每个IndexPath的单元格(将它们作为自定义CollectionViewCell进行广播以访问您的按钮)。现在,您可以将每个标题附加到数组中以保存它们。

var titleArray = [String]()

    guard let selectedIndexPaths = collectionView.indexPathsForSelectedItems else { return }

    for indexPath in selectedIndexPaths {
        if let cell = collectionView.cellForItem(at: indexPath) as? WordCollectionViewCell {
            self.titleArray.append(cell.yourButton.titleLabel?.text)
        }
    }

答案 1 :(得分:0)

欢迎来到SO。这听起来有点像X / Y问题:这种情况下,您是在询问如何实施特定的(通常是次优的)解决方案,而不是首先询问如何解决问题。

您不应将集合视图中的视图视为保存数据。 (按钮是视图。)

您应该使用该按钮找出用户点击的单元格的indexPath,然后在数据模型中查找信息。

您应该设置一个结构体数组(如果您的集合视图位于行的各个部分中,则应设置一个数组体数组。)每个这些结构体都应包含单元格的当前设置。

您的collectionView(_:cellForItemAt:)方法应使用结构数组来配置要展示的销售商品。

当用户点击按钮并选择单元格时,您应该在适当的IndexPath处更新结构,然后告诉集合视图更新那些单元格。

如果需要对选定的单元格进行操作,则应向集合视图询问选定单元格的数组,应使用这些IndexPath索引到模型数组中,并获取每个IndexPath的结构,然后查找所需的数据。

编辑:

您可以使用UICollectionView的一个非常简单的扩展来在您的集合视图中查找任何视图的indexPath(按钮是一个视图,如上所述)。

extension UICollectionView {
    func indexPathForCellContaining( view: UIView) -> IndexPath? {
        let viewCenter = self.convert(view.center, from: view.superview)
        return self.indexPathForItem(at: viewCenter)
    }
}