UICollectionView - 如何更新来自一个单元格的所有单元格

时间:2017-02-15 08:59:09

标签: ios swift uicollectionview

我有一个CollectionView并且在collectionView的每个单元格中有一个textField

如果textfield的所有内容均为nil,则当我更改一个textfield的内容(例如 cell_1 )时,所有其他内容textfield s会自动更新的内容,例如 cell_1 textfield的内容。

我尝试使用collectionView.visibleCells,但它对我的场景无效。

有没有办法可以更改一个单元格,然后更新CollectionView中的所有单元格?

请帮忙。提前谢谢!

2 个答案:

答案 0 :(得分:2)

清除新细胞:
由于我不理解您的问题达到100%,我认为您的问题是新细胞获得 cell_1 的值,这不是您想要的。

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

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

应该这样做,因为textfield被称为textfield

  

执行必要的清理以准备视图以便再次使用。   https://developer.apple.com/reference/uikit/uicollectionreusableview/1620141-prepareforreuse

更新所有单元格
如果您的问题是如何更新其他单元格以获得与 cell_1 相同的内容,那么这意味着集合视图子类需要知道 cell_1 中的更新,然后转换更新到其他单元格。 一种方法是在集合视图中设置textfield委托。当值更改(textField(_:shouldChangeCharactersIn:replacementString:))时,获取所有可见单元格并相应地更新textfields。也许还保存对 cell_1 textfield的引用,或者在集合视图中保存最新输入值的字符串变量,以便您可以在呈现时更新单元格。 您想要使用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
    }

}

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

答案 1 :(得分:1)

试试这个 -

第1步 -

创建集合视图的变量like和IBOutlet -

var xyzString: String?
@IBOutlet weak var collectionView: UICollectionView! // IBOutlet of your collection view

第2步 -

  func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "TagViewCell", for: indexPath) as? TagViewCell // instead of TagViewCell give your custom cell class name
    if self.xyzString != nil {
      cell?.txtField.text = self.xyzString // if you want same value for all cell
     }
    return cell!
}

第3步 -

  func textFieldDidEndEditing(_ textField: UITextField) {
    self.xyzString = textField.text
    self.collectionView.reloadData()
}