クリア新しい細胞:私は100%にあなたの質問を理解しておりませんので
、私はあなたの問題は新しい細胞が、あなたが望むものではありませんcell_1、の値を取得することであることを前提としています。
この場合、UICollectionViewCell
にprepareForReuse
という機能があります。 UICollectionViewCell
のサブクラスで は、次のように実装します
トリックを行う必要があります
override func prepareForReuse() {
super.prepareForReuse()
textfield.text = ""
}
、あなたのtextfield
がtextfield
と呼ばれていることを考えます。
再度使用するためにビューを準備するために必要なクリーンアップを実行します。 https://developer.apple.com/reference/uikit/uicollectionreusableview/1620141-prepareforreuse
アップデートすべてのセル:あなたの質問は、cell_1と同じコンテンツを取得するために他のセルを更新する方法であれば
が、これはコレクションビューサブクラスがで更新について知る必要があることを意味cell_1とし、その更新を他のセルに変換します。 これを行う1つの方法は、textfield
のデリゲートをコレクションビューに設定することです。値が変更されたら(textField(_:shouldChangeCharactersIn:replacementString:)
)、すべての表示セルを取得し、それに応じてtextfields
を更新します。また、textfield
への参照をcell_1に保存するか、最新の入力値を示すコレクションビューの文字列変数を保存して、レンダリング時にセルを更新することもできます。 You 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は、現在表示されている細胞をループすることです。通常、私は絶対に必要でない限りループを止めることをお勧めしますが、上記のソリューションの代わりに、通知を送信し、セルがその通知を受け取り、それに従ってコンテンツを更新することがあります。それを行うことは、過度なだけでなく、何か通知が本当に意味されていません。 3番目のオプションは、すべてのテキストフィールドに配列の弱い参照を保持することです。これは不必要なオーバーヘッドを作成するため最適ではない可能性があります。結局のところ、visibleCells
はすでに、現在表示されているセルの配列であり、それぞれがUITextField
への参照を保持しています。
私は完全にあなたに従っているわけではありません。すべてのセルが** cell_1 **の価値を得ているか、** cell_1 **の値にすべてのセルを更新したいという問題です** cell_1 **の「テキストフィールド」に何かを入力しますか? –
@PaulPeelen cell_1のテキストフィールドに何かを入力すると、すべてのセルがcell_1の値に更新されます。 – javimuu