如何在我的CollectionViewController中访问存储在CollectionViewCell中的变量

时间:2018-02-10 20:51:43

标签: ios swift uicollectionview uicollectionviewcell uicollectionviewdelegate

您好我访问存储在CollectionViewCell内部的String值时遇到问题,以便在我的CollectionViewController中使用segue。

我的CollectionViewController包含任意数量的单元格,这些单元格具有Button,Label和ID。当用户按下按钮时,我想要转到新的ViewController并将ID作为参数传递。

我意识到你无法从CollectionViewCell中脱离出来,所以我需要找到一种方法来获取在我的CollectionViewController中按下按钮的单元格的访问ID。

以下是我创建单元格的方法:

    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {

    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "collection_cell", for: indexPath) as! GroupCollectionViewCell

    if(GroupViewController.GI.getIds().count>1)
    {
        cell.groupNameLabel.text! = GroupViewController.GN.getNames()[indexPath.row].removeCharacters(from: "\"")
        cell.groupId = GroupViewController.GI.getIds()[indexPath.row]
        cell.groupName = GroupViewController.GN.getNames()[indexPath.row].removeCharacters(from: "\"")


    }
    return cell

}

值得一提的是,我尝试了下载didSelectItem atIndexPath路由并遇到了一些问题。也就是说,当我按下按钮时,根本不会调用该功能。 以下是我宣布该功能的方法。按下按钮从不打印出“测试”。

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
    print("test")
}

我将添加我的CollectionViewControllerCell的代码,以防有:

class GroupCollectionViewCell: UICollectionViewCell {

@IBOutlet weak var cellButton: UIButton!
@IBOutlet weak var groupButton: UIButton!
@IBOutlet weak var groupNameLabel: UILabel!
var groupId: String = ""
var groupName: String = ""

@IBAction func buttonPressed(_ sender: UIButton) {
    print(self.groupId)
    print(self.groupName)

}

}

因此,如果任何人有一个很好的方法来实现我的目标,我会非常感激。 This is a photo of my CollectionViewController with 6 items

编辑: 我已经意识到单击我的CollectionViewControllerCell中的标签会调用我的didSelectItemAtPath函数,但不会调用按钮。有没有办法让它们都这样做?

1 个答案:

答案 0 :(得分:0)

您没有提到它,但我假设您在GroupViewController中实现了委托和数据源。

在这种情况下,解决问题的最简单方法是为您的单元格添加一个闭包:

final class GroupCollectionViewCell: UICollectionViewCell {

    @IBOutlet private weak var cellButton: UIButton!
    @IBOutlet private weak var groupButton: UIButton!
    @IBOutlet private weak var groupNameLabel: UILabel!

    var groupId: String = ""
    var groupName: String = "" {
        didSet {
          groupNameLabel.text = groupName
        }
    }
    var cellSelected: (_ groupId: String, _ groupName: String) -> Void = { _, _ in }

    @IBAction func buttonPressed(_ sender: UIButton) {
        cellSelected(groupId, groupName)
    }
}

创建单元格时,必须设置闭包:

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "collection_cell", for: indexPath) as! GroupCollectionViewCell
    if GI.getIds().count > 1 {
        cell.groupId = GI.getIds()[indexPath.row]
        cell.groupName = GN.getNames()[indexPath.row].removeCharacters(from: "\"")
        cell.cellSelected = { [weak self] groupId, groupName in
            self?.mySequeImplementation(toId: groupId, name: groupName) // contains you implementation of the transition
        }
    }
    return cell
}

请注意,您必须添加[弱自我]!否则你会得到一个保留循环(内存泄漏)。

您不需要didSelectItemAt方法实现,甚至可以停用单元格选择。