2017-03-07 6 views
0

テーブルビューでバッチ更新を行うための一般的な差分関数を作成しようとしています。基本的には、各セクションの識別子と各セクションの各行の識別子を含むセクションの2つの配列を取り、削除、挿入または移動、および削除、挿入または移動する個々の行のセクションを計算します。すなわち、deleteSections(_:with:),insertSections(_:with:),moveSection(_:toSection:),deleteRows(at:with:),insertRows(at:with:)およびmoveRow(at:to:)の適切な入力。テーブルビューの行は、セクションが移動している間も置くことができますか?

これはかなり一般的なことだと思っていましたが、何ができるかに限界があるようですが、何か不足しているかどうかを確認したいと思っていました。

「フルーツ」と「野菜」の2つのセクションがあります。果物には「バナナ」、野菜には「キャロット」があります。

突然バナナが野菜、ニンジンが果物になるように切り替えたいとしましょう。容易に、私はmoveRow(at: [0, 0], to: [1, 0]moveRow(at: [1, 0], to: [0, 0])を生成し、それに応じてデータソースを更新します。行が切り替わります。

ここで、代わりに2つのセクションで場所を切り替えるとします。私はmoveSection(0, toSection: 1)をやります(または私はmoveSection(1, toSection: 0、あるいはその両方を行うことができます - この場合は関係ありません)。 OK。ニンジンの列は、今野菜のセクションと一緒に果物とバナナと一緒に移動します。

しかし、今は...私はこれらのことを同時にしたいと思います。セクションは場所を切り替える必要がありますが、項目は置かれたままにするか、別の言い方をするために、物理的な行を保持する論理セクションを切り替える必要があります。これは可能ではないようです。

私は(同じ beginUpdate/ endUpdate内==) moveSectionと同時に、を行うことを試みた

moveRow(at: [0, 0], to: [0, 0])moveRow(at: [1, 0], to: [1, 0])を行うが、moveRowに、これらの呼び出しは、彼らがのように見えるだけで何の-OPSません。*

私はまた、deleteRows/insertRowsを実行して、行をそのまま残すようにしました。その代わりに、私のクラッシュを与える:

がキャッチされない例外により「NSInternalInconsistencyException」にアプリを終了、理由:「セルの2つのアニメーションを作成するための試み」

reloadRowsはどちらか動作しませんが。 af300はdeleteRows/insertRowsと同じです。

だから、基本的に私の質問は:

は、私は何かが足りないのですか?これは可能ですか?

(新しいデータでセルまたはヘッダを再設定するなどの回避策に興味を持っていない、私は実際に私がちょうど知ってほしい、私はこれを行うにはを必要状況を持っていない!)

Demo code if anyone wants to play around.

(*実際には、moveSection(0, toSection:1)moveSection(1, toSection:0)の両方と組み合わされた場合、実際にはno-opsに過ぎません。これらのうちの1つだけが実行されると、内部的な一貫性のクラッシュが発生します。)

答えて

1

これにあなたのswitchBothNoOp()を変更します。

func switchBothNoOp() { 
    switch state { 
    case .first: 
     sections = [("Fruits", ["Banana"]), 
        ("Vegetables", ["Carrot"])] 

    case .second: 
     sections = [("Vegetables", ["Banana"]), 
        ("Fruits", ["Carrot"])] 
    } 
    tableView.moveSection(0, toSection: 1) 
} 

その後、あなたは、後で別のものを使用して行を/最後の更新ブロックを開始動かします。例:

func update() { 
    tableView.beginUpdates() 

    // Pick on of these: 
//  switchItems() 
//    switchSections() 
    switchBothNoOp() 
     //  switchBothCrash() 


    tableView.endUpdates() 

    tableView.beginUpdates() 
    tableView.moveRow(at: [0, 0], to: [1, 0]) 
    tableView.moveRow(at: [1, 0], to: [0, 0]) 
    tableView.endUpdates() 
} 
+0

これは完全に機能します。ありがとう! – skagedal

+0

心配はいりません。それが喜んで役立ちます。 –

関連する問題