2017-02-15 9 views
0

から変更してすべてのセルを更新するにはどうすればCollectionViewを持っており、このcollectionViewの各セル内1 textFieldあります。UICollectionViewは - 一つのセル

textfieldのすべてのコンテンツがnilある場合、私はcell_1におけるtextfieldの内容等他のすべてのtextfield sは意志自動更新コンテンツ(例えばcell_1用)を一度textfieldの内容を変更します。

私はcollectionView.visibleCellsで試しましたが、私のシーンでは正しく動作しません。

CollectionViewにある1つのセルを変更して、すべてのセルを更新できる方法はありますか?

助けてください。前もって感謝します!

+0

私は完全にあなたに従っているわけではありません。すべてのセルが** cell_1 **の価値を得ているか、** cell_1 **の値にすべてのセルを更新したいという問題です** cell_1 **の「テキストフィールド」に何かを入力しますか? –

+0

@PaulPeelen cell_1のテキストフィールドに何かを入力すると、すべてのセルがcell_1の値に更新されます。 – javimuu

答えて

2

クリア新しい細胞:私は100%にあなたの質問を理解しておりませんので
、私はあなたの問題は新しい細胞が、あなたが望むものではありませんcell_1、の値を取得することであることを前提としています。

この場合、UICollectionViewCellprepareForReuseという機能があります。 UICollectionViewCellのサブクラスで は、次のように実装します

トリックを行う必要があります
override func prepareForReuse() { 
    super.prepareForReuse() 
    textfield.text = "" 
} 

、あなたのtextfieldtextfieldと呼ばれていることを考えます。

再度使用するためにビューを準備するために必要なクリーンアップを実行します。 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への参照を保持しています。

1

これを試してみてください -

ステップ1 -

あなたのコレクションビューのような変数と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() 
} 
+0

失敗します。 'cell?.txtField'は' String'に適合しない 'UITextField'型です。また、 'UITextField.text'はオプションの型' String'であるため、 'if case'の必要はありません。 'cell?.txtField.text = xyzString'の設定は、' xyzString'もオプションの 'String'であるので十分です。また、私が誤解されていなければ、 'xyzString'はフォーカスが' UITextField'から落とされない限り更新されません。 –

+0

@PaulPeelen - ご意見ありがとうございます。 :) –

+0

あなたの歓迎=) –

関連する問題