我的目标是可以从容器视图内的UICollectionViewCell
配置标签。
我有一个UICollectionView
的视图控制器,如果我双击这些单元格之一,则会打开一个容器视图。这已经在工作,但是我在UITextField
中有一个ContainerViewController
,它应该更新nameLabel
的ItemCell
。
如何从containerController
到ItemCell 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
中输入的文本将更新集合视图的数据源,然后应用程序将重新加载该单元格。按照现在的方式,一旦单元被重用,文本将恢复为数据源所说的内容。只是要考虑的事情。