web-dev-qa-db-ja.com

アニメーションでテーブルビューセルをリロードする(Swift)

特定のUITableViewセルをアニメーション付きの複数のセクションでリロードする方法はありますか?

私は使用しています:

self.TheTableView.reloadSections(NSIndexSet(index: 1), withRowAnimation: UITableViewRowAnimation.Right)

ただし、これによりセクション内のすべてのセルがアニメーション化されます。他のオプションは以下を使用することです:

self.TheTableView.reloadRowsAtIndexPaths(<#indexPaths: [AnyObject]#>, 
                                         withRowAnimation: <#UITableViewRowAnimation#>)

編集:

ReloadRowsAtIndexPathsを使用した後

キャッチされない例外 'NSInternalInconsistencyException'によるアプリの終了、理由: '無効な更新:セクション1の行数が無効です。更新後の既存のセクションに含まれる行数(5)は、その中に含まれる行数と等しくなければなりません更新前のセクション(4)、そのセクションから挿入または削除された行の数(0が挿入、0が削除)とそのセクションに出入りした行の数にプラスまたはマイナス(0が移動、0が移動)でる)。'

オブジェクトを配列に追加することにより、tableviewを再読み込みするスムーズな方法を見つけようとしています。

ReloadRowsAtIndexPathsが機能する前にTheTableView.reloadData()を呼び出しますが、アニメーションに不具合があります。別のアプローチはありますか?

14
William Larson

なぜセルを直接リロードしないのですか? indexPathにはセクションと行が含まれているため、リロードするセクションを追跡し、その配列のインデックスを埋めるだけです。

var indexPath1 = NSIndexPath(forRow: 1, inSection: 1)
var indexPath2 = NSIndexPath(forRow: 1, inSection: 2)
self.tableView.reloadRowsAtIndexPaths([indexPath1, indexPath2], withRowAnimation: UITableViewRowAnimation.Automatic)

コメントに基づいて、配列を変更し、tableViewを変更でアニメーション化しようとしています。その場合は、UITableViewsにbeginUpdates()およびendUpdates()を使用するか、または NSFetchedResultsController を使用して、すべての更新アニメーションをきれいに処理することを検討する必要があります。

self.tableView.beginUpdates()
// Insert or delete rows
self.tableView.endUpdates()

Core Dataを使用している場合は、このプロセス全体を簡素化するため、 NSFetchedResultsController を使用することをお勧めします。それ以外の場合は、変更を自分で処理する必要があります。つまり、配列が変更された場合、beginUpdates()およびendUpdates()を使用して、TableViewの行を手動で削除または挿入する必要があります。 Core Dataを使用していない場合は、 this を調べて、すべての処理方法を把握してください。

11
Mark McCorkle

In Swift 3.

Tableviewの特定のセクションの特定の行をリロードできます

let indexPath = IndexPath(item: 2, section: 0)
self.tableView.reloadRows(at: [indexPath], with: .automatic)
4
jaiswal Rajan

Swift 3.0で単一のセクションをリロードしたい場合、これを行うことができます:

tableView.reloadSections(IndexSet(integer: 0), with: .automatic)
3
alessioarsuffi

定義IndexSet公式ドキュメント:

Cocoa APIでインデックスタイプとして一般的に使用される整数値のSetを管理します。有効な整数値の範囲は(0、INT_MAX-1)です。この範囲外のものはすべてエラーです。

そのため、IndexSetはインデックスについて設定され、[]にいくつかのInt値を入れるだけです

// for reload one section
tableView.reloadSections([section], with: .automatic)
// or using like this
tableView.reloadSections(IndexSet(integer: section), with: .automatic)

// for reload multi sections
tableView.reloadSections([1, 2, 3, section], with: .automatic)
2
Junhang Lv