我有一个按钮的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中的按钮有关。
任何帮助将不胜感激。
答案 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)
}
}