2017-10-13 8 views
0

私のリストにバッチ削除を実装しようとしましたが、私のコードはこのように見えます。テーブルビューの範囲外のインデックス:バッチ削除後のcanEditRowAtテーブルビューで

func deleteSelection() { 
    var deletedIndexPaths: [IndexPath] = [] 
    for (index, item) in self.itemsArray.enumerated().reversed() { 
     if item.isSelected { 
      self.itemsArray.remove(at: index) 
      deletedIndexPaths.append(IndexPath(row: index, section: 0)) 
     } 
    } 
    if !deletedIndexPaths.isEmpty { 
     self.tableView.deleteRows(at: deletedIndexPaths, with: .automatic) 
    } 
} 
func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool { 
    return self.itemsArray[indexPath.row].isEditable 
} 

私は、テーブルビュー内の範囲外のインデックスを取得:canEditRowAt はあるバッチへの適切な方法をcanEditRowAt

を実装しながら、私の現在のソリューションは、アイテムが

を除去される行を削除することであるのtableViewに削除
func deleteSelection() { 
    self.tableView.beginUpdates() 
    for (index, item) in self.itemsArray.enumerated().reversed() { 
     if item.isSelected { 
      self.itemsArray.remove(at: index) 
      self.tableView.deleteRows(at: IndexPath(row: index, section: 0), with: .automatic) 
     } 
    } 
    self.tableView.endUpdates() 
} 

これで機能しますが、元のコードも機能しないはずですか?

+0

どこでエラーが発生しますか?スタックトレースとコードを送信します。 –

答えて

-1

セクションビューおよび行カウントメソッドをトリガーするようにtableviewに指示していないため、最初のケースのサンプルコードは機能しません。これはbeginUpdatesメソッドとendUpdatesメソッドによって行われます。そのため、2番目の例が機能します。

func deleteSelection() { 
    var deletedIndexPaths: [IndexPath] = [] 
    tableView.beginUpdates() 
    for (index, item) in self.itemsArray.enumerated().reversed() { 
     if item.isSelected { 
      self.itemsArray.remove(at: index) 
      deletedIndexPaths.append(IndexPath(row: index, section: 0)) 
     } 
    } 
    if !deletedIndexPaths.isEmpty { 
     self.tableView.deleteRows(at: deletedIndexPaths, with: .automatic) 
    } 
    tableView.endUpdates() 
} 

はまた、iOSの11で、Appleが私たちに私たちはいくつかの別々のアニメーションとは反対に、1回のアニメーションの操作でテーブルビューに複数の変更を行いたいメソッドの方法を提供することperformBatchUpdates(_:completion:)を導入しました。 iOS 11以上で使用できます。

func deleteSelection() { 
    var deletedIndexPaths: [IndexPath] = [] 

    for (index, item) in self.itemsArray.enumerated().reversed() { 
     if item.isSelected { 
      self.itemsArray.remove(at: index) 
      deletedIndexPaths.append(IndexPath(row: index, section: 0)) 
     } 
    } 

    if !deletedIndexPaths.isEmpty { 
     tableView.performBatchUpdates({ 
      self.tableView.deleteRows(at: deletedIndexPaths, with: .automatic) 
     }) { (completed) in 

     } 
    } 
} 
関連する問題