2017-10-12 14 views
1

iOS 11の方法でテーブルビューの行にスワイプアクションを追加しようとしています。行を削除するアクションを追加したいと思います。UITableView - データを再読み込みしないUIContextualAction

class ViewController: UIViewController { 
    var numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 
} 

Iが行を選択すると、私はnumbersの関連した値を出力:

私のテストテーブルビューディスプレイ番号0から9まで、データ・ソースが整数の単純なアレイである、numbersと呼ば

func tableView(_ tableView: UITableView, trailingSwipeActionsConfigurationForRowAt indexPath: IndexPath) -> UISwipeActionsConfiguration? { 

    let delete = UIContextualAction(style: .destructive, title: "Delete") { (_, _, completionHandler) in 
     self.numbers.remove(at: indexPath.row) 
     completionHandler(true) 
    } 

    return UISwipeActionsConfiguration(actions: [delete]) 
} 
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 
    print(numbers[indexPath.row]) 
    tableView.deselectRow(at: indexPath, animated: true) 
} 

私は以下のように新しいデリゲートtrailingSwipeActionsConfigurationForRowAtを実装します

行をスワイプすると、削除が正常に機能します。しかし、それは...私は削除した後に別の行を選択すると、関連するIndexPathが間違っている、

例私の問題だ:私は最初の行を選択し

  • 、印刷された値が0である:OK。
  • 最初の行を削除します。
  • 新しい最初の行を選択すると、パラメータで渡されたIndexPathが行0ではなく行1であるため、印刷される値は2です。

私は間違ったやり方をしていますか?

答えて

3

あなたのケースにはnumbersアレイのモデルとビュー、表示されるセルがあることを覚えておくことが重要です。 numbersから要素を削除すると、モデルのみが更新されます。

ほとんどの場合、コード化されているように、モデルがビューと同期していないため、すぐにエラーが発生します。

しかし、私のテストでは、スタイルが.destructiveで、truecompletionHandlerに渡すと、Appleがあなたのために行を削除していることを示しています。だからあなたは行が消えているのを見ているのです。しかし、それについては正しくないことがあり、私はそれに関する文書を見つけることができません。一方

は、ちょうどこの操作を行います。

self.numbers.remove(at: indexPath.row) 
tableView.deleteRows(at: [indexPath], with: .automatic) 
completionHandler(true) 

そしていつもあなたがモデルに変更した場合は、ビューを更新する必要があることを覚えておいてください。

+0

ありがとうございます!私は、補完ハンドラの周りのドキュメントの不足によってかなり混乱しています。 'UIContextualAction'初期化子に渡されるクロージャーブロックの引数の1つとして、私たちが定義できるものではないと思いますか? – aganders3

関連する問題