【问题标题】:How can I get the button title for each selected cell in a UICollectionView?如何获取 UICollectionView 中每个选定单元格的按钮标题?
【发布时间】:2019-02-08 21:49:38
【问题描述】:

我有一个按钮的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 中的按钮有关。

任何帮助将不胜感激。

【问题讨论】:

  • “怀疑我可能不得不使用 indexPathsForSelectedItems 但我已经尝试过但无法使其正常工作”但是在您显示的代码中,您没有尝试过。请展示一个实际的尝试。
  • 对不起,我的尝试添加到问题中。
  • 不过,这并不清楚,你想象的会导致indexSelected 被调用。
  • 我有一个按钮,点击后会调用 indexSelected。

标签: swift uicollectionview uicollectionviewcell


【解决方案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)
        }
    }

【讨论】:

  • 感谢您的回复。这仅返回最后选择的单元格 - 即,如果我单击 4 个单元格,它将返回我单击的第 4 个单元格。我将如何修改代码以便获得所有四个按钮的标题?对不起,如果这是一个愚蠢的问题 - 我对此很陌生。
  • 我编辑了我的原始答案。您只需要创建一个数组,当您遍历所有选定的单元格时,您就可以将每个标题附加到数组中。
  • 我自己也尝试过类似的方法,但得到了相同的结果。我想我的 collectionView 设置可能不正确,因此它不允许选择多个单元格。此外,此刻我必须选择单元格而不是单元格内的按钮。你知道我是否可以通过点击单元格内的按钮来选择单元格?
  • 在您的 viewDidLoad 中执行此操作以启用多项选择:collectionView.allowsMultipleSelection = true 很难通过 StackOverflow cmets 为您提供帮助,还有其他地方可以联系到您吗?
【解决方案2】:

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

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

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

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

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

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

如果您需要对选定的单元格做一些事情,您应该向集合视图询问选定单元格的数组,您应该使用这些 IndexPaths 索引到您的模型数组并获取每个 IndexPath 的结构,然后查看收集你需要的数据。

编辑:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-29
    • 2020-08-10
    • 2018-05-10
    • 1970-01-01
    • 1970-01-01
    • 2019-10-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多