2016-07-15 8 views
1

私はUITableViewベースのゲームショップを持っています。アニメーションに害を与えずにテーブルビューでデータを再ロード

すべてのセルには、ほとんどが有効になっており、ワンタイム購入の場合は「BOUGHT」に切り替えることができ、十分な金額がない場合は無効にすることができます。

現時点では、表示されているセルと現在のセル自体を更新するために購入ボタンを押すたびにreloadDataを呼び出しています。 (私はすべてのセルを更新する必要があります。なぜなら、購入後、目に見えるアイテムセルには十分な金額がないことがあるからです)。

しかし、1つのセルの購入ボタンをクリックして別のアニメーションでアニメーションが終了するような不思議なアニメーションの不具合が発生します。

これは、細胞の再利用性のために起こると思います。だから私が知りたいのは、元のアニメーションを損なうことなくテーブルビュー全体でデータを再ロードする方法です。

私が考えることができるのは再利用可能なセルを使用せず、それらをすべてキャッシュすることだけではありませんが、これは良いプログラミング方法ではないと思います。

答えて

2

まず、ビューレイヤーとモデルレイヤーが別々であることを確認します。各項目について知っている非ビューオブジェクトがあるはずです。我々はそれをItemと呼ぶでしょう。

ItemCellを作成してください(おそらく既に1つあります)。それはあなたの再利用可能な細胞です。 Itemを手渡してください。それはそこのデータに基づいてそれ自体を構成する必要があります。

KVO、委任、または通知を使用して、セルにアイテムを観察させます。 Itemが状態を変更すると、セルはそれ自身のボタンを更新するはずです。

セルが再利用されると、新しいセルがitemに渡されます。それは以前のものの観察をやめ、新しいものの観察を開始する必要があります(そしてもちろん、現在の状態に合わせて再構成してください)。

(再利用可能で一時的な)ビュー(モデルは安定して長持ち)を分離することにより、正確なアニメーションによるセル再利用のパフォーマンス上の利点が得られ、reloadDataに電話する必要はありません。

+0

まあ、セルがモデルであることを知っているとき、これは悪いデザインだと思った... – s1ddok

+0

そして、私はそれがお金があるかどうかを確認するために他のセルを更新するのに役立つ方法を見ていない – s1ddok

+0

セルは、モデルクラスは優れたデザインであり、スモールトークに戻ることができます。モデルを単に観察し、それを視覚的に表現する限り、セルは単なるビューです。彼らが合計金額を知る必要がある場合は、それらに「勘定」オブジェクトを渡すことができます。 –

0

セルクラスでreloadCellメソッドを使用し、テーブルのvisibleCellsをループし、UIをそのように更新できます。そうしたやり方では、再作成(または再利用)されず、更新された新しいデータのために変更された可能性のある関連するUI部分があります。

+0

これはうまくいく可能性がありますが、モデルについてはセルに伝える必要があります。それは避けようとしているものです。 – s1ddok

+0

セルを最初に設定しています。 – Putz1103

関連する問題