我的目标是可以从容器视图内的UICollectionViewCell配置标签。

我有一个UICollectionView的视图控制器,如果我双击这些单元格之一,则会打开一个容器视图。这已经在工作,但是我在UITextField中有一个ContainerViewController,它应该更新nameLabelItemCell

如何从containerControllerItemCell func changeName()获得text属性?

class ItemCell: UICollectionViewCell {
    @IBOutlet weak var nameLabel: UILabel!

    func changeName() {
        nameLabel.text = containerController.nameField.text
    }
}


显然,此功能不起作用。

var containerController = ContainerController()
class ContainerController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
    }

    @IBOutlet weak var nameField: UITextField!
}

最佳答案

当您双击该单元格时,将点击的单元格的引用传递给ContainerController,然后让ContainerController实例在该单元格上调用changeName函数。我建议更改changeName函数以接受String,如下所示:

class ItemCell: UICollectionViewCell {

    @IBOutlet weak var nameLabel: UILabel!

    func changeName(newName: String) {
        nameLabel.text = newName
    }

}


给出代码后的更新

您可以做的一件事是像这样向ContainerController添加属性:

weak var textCell: ItemCell?


然后还更改ItemCell中的方法以采用String

func changeName(newName: String) {
    nameLabel.text = newName
}


然后在您的handleTap(_:)方法中,在其中检索单元格并调用openContainer()的地方,将其更改为以下内容:

if let index = indexPath,
    let cell = ItemCollection.cellForItemAtIndexPath(index) as? ItemCell {
    container.textCell = cell
    openContainer()
} else {
    print("Could not find index path or cell")
}


然后在您的ContainerController中,一旦输入了文本,请使用新文本调用textCell?.changeName(_:)

我还想补充一点,我不建议您这样做。理想情况下,用户在ContainerController中输入的文本将更新集合视图的数据源,然后应用程序将重新加载该单元格。按照现在的方式,一旦单元被重用,文本将恢复为数据源所说的内容。只是要考虑的事情。

10-08 05:22