如何访问存储在我的 UICollectionViewController 中的集合视图单元格中的变量

Posted

技术标签:

【中文标题】如何访问存储在我的 UICollectionViewController 中的集合视图单元格中的变量【英文标题】:How to access a variable stored in a CollectionViewCell in my CollectionViewController 【发布时间】:2018-02-10 20:51:42 【问题描述】:

您好,我在访问存储在我的 CollectionViewCell 中以在我的 CollectionViewController 中的 segue 中使用的字符串值时遇到问题。

我的 CollectionViewController 由任意数量的具有按钮、标签和 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 函数,但不会调用按钮。有没有办法让两者都这样做?

【问题讨论】:

您不需要从您的单元格中获取值。您的单元格仅显示数据模型中的值。从数据模型中获取您需要的价值。如果您希望按钮点击在单元格中工作,那么我建议您在单元格类中编写点击处理程序代码并使用委托模式将事件通知视图控制器 啊,是的,看来我可能有点把事情复杂化了。所以我意识到我现在可以忽略这个问题的大部分内容,除了最后一次编辑。你有什么想法为什么 didSelectItemAtPath 只在我按下标签而不是 CollectionViewCell 中的按钮时返回一个数字,以及我该如何解决这个问题? 标签不响应触摸,因此单元格本身接收触摸并调用didSelect。当一个按钮被点击时,它会接收到触摸,所以didSelect 不会被调用。您需要在单元格中使用按钮点击处理程序,或者如果您真的不需要按钮,请使用图像视图。 好的,谢谢您的帮助! 【参考方案1】:

你没有提到它,但我假设你在 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 方法实现,甚至可以停用单元格选择。

【讨论】:

以上是关于如何访问存储在我的 UICollectionViewController 中的集合视图单元格中的变量的主要内容,如果未能解决你的问题,请参考以下文章

如何在我的 android 程序中访问联系人

如何使用 React + Webpack 应用程序存储和访问我的 API 密钥?

Android - 如何在 WebView 中访问本地存储值?

如何在我的 pyspark 代码中访问 S3 中的 Amazon kinesis 流文件?

如何使存储的图像文件夹只能通过 php 代码访问

使用 Spring Security 3 在我的 Grails OAuth 提供程序上存储访问令牌