gpt4 book ai didi

ios - UICollectionView - 如何使用一个单元格的更改更新所有单元格

转载 作者:行者123 更新时间:2023-11-28 10:57:47 28 4
gpt4 key购买 nike

我有一个 CollectionView 并且在这个 collectionView 的每个 cell 中有一个 textField

如果 textfield 的所有内容都是 nil,当我更改一个 textfield 的内容时(例如 cell_1) 所有其他 textfield 将自动更新具有 value 的内容,如 cell_1textfield 的内容。

我已经尝试使用 collectionView.visibleCells,但它在我的场景中无法正常工作。

有什么方法可以更改一个单元格然后更新 CollectionView 中的所有单元格?

请帮忙。提前致谢!

最佳答案

清除新单元格:
由于我没有 100% 理解您的问题,我假设您的问题是新单元格获得了 cell_1 的值,这不是您想要的。

如果是这样,那么在UICollectionViewCell 中有一个名为prepareForReuse 的函数。在 UICollectionViewCell 的子类中,实现以下内容:

override func prepareForReuse() {
super.prepareForReuse()
textfield.text = ""
}

鉴于您的 textfield 名为 textfield,这应该可以解决问题。

Performs any clean up necessary to prepare the view for use again. https://developer.apple.com/reference/uikit/uicollectionreusableview/1620141-prepareforreuse

更新所有单元格:
如果您的问题是如何更新其他单元格以获得与 cell_1 相同的内容,那么这意味着 Collection View 子类需要了解 cell_1 中的更新,然后进行转换更新到其他单元格。一种方法是在 Collection View 中设置 textfield 的委托(delegate)。当值更改时 (textField(_:shouldChangeCharactersIn:replacementString:)),获取所有可见单元格并相应地更新那些 textfields。也可以在 cell_1 中保存对 textfield 的引用,或者在您的 Collection View 中保存一个字符串变量,说明最新输入的值,以便您可以在单元格呈现时更新它们。不过,您不想使用reloadData(),因为这会从textField 中移除焦点,因为textField 已重新加载。

解决方法:

class ViewController: UIViewController {
@IBOutlet weak var collectionView: UICollectionView!

fileprivate var customString: String?
}

extension ViewController: UICollectionViewDataSource {

func numberOfSections(in collectionView: UICollectionView) -> Int {
return 1
}

func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return 5
}

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "CustomCell", for: indexPath) as! CustomCell

cell.textField.delegate = self
cell.textField.text = customString

return cell
}

}

extension ViewController: UITextFieldDelegate {

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {

customString = string

for cell in collectionView.visibleCells {
if let cell = cell as? CustomCell,
let text = textField.text,
cell.textField != textField {
cell.textField.text = text+string
}
}

return true
}

}

上面代码中唯一的缺点是它循环遍历当前可见的单元格。通常我建议不要循环,除非绝对必要,但上述解决方案的替代方法是发布通知并让单元格收听该通知并相应地更新其内容。这样做不仅会矫枉过正,而且通知并不是真正的目的。第三种选择是在数组中保存对每个文本字段的弱引用,这也可能不是最佳选择,因为它会产生不必要的开销。毕竟 visibleCells 已经是一个当前可见的单元格数组,每个单元格都包含对 UITextField 的引用。

关于ios - UICollectionView - 如何使用一个单元格的更改更新所有单元格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42244744/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com