从不同 class 调用 UITextField 的内容

Call content of UITextField from different class

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

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

nameLabel

如何将文本 属性 从 containerController 获取到 ItemCell func changeName()

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 中输入的文本会更新集合视图的数据源,然后应用程序会重新加载该单元格。按照现在的方式,一旦单元格被重新使用,文本就会恢复为数据源所说的内容。只是需要考虑的事情。