私tableView
cellForRowAtIndexPath
はそうのようになります。テーブルビュー内の行を削除sender.tagを使用している間
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: CheckoutAppointmentCell.reuseIdentifier) as! CheckoutAppointmentCell
cell.appointment = appointments[indexPath.row]
cell.checkoutButton.tag = indexPath.row
cell.checkoutButton.addTarget(self, action: #selector(checkoutButtonTapped), for: .touchUpInside)
return cell
}
そして私はそうのようなtableView
とdataSource
から予定を削除します。
func checkoutButtonTapped(sender: UIButton) {
appointments.remove(at: sender.tag)
print(sender.tag)
//self.tableView.beginUpdates()
self.tableView.deleteRows(at: [IndexPath(row:sender.tag, section: 0)], with: .automatic)
//self.tableView.endUpdates()
}
初めて私は予定を削除し、それは正常に動作します。 sender.tag
値は正しい値で、正しい行はtableView
から削除されます。
最初の行を削除した後に、間違った行が削除されたように見えます。
deleteRows
を呼び出した後、私はreloadData()
を呼び出してみましたが、アニメーションはもう発生しません。 beginUpdates()
とendUpdates()
でも違いはないようです。
この行が実際に意味するもの:最初の行を削除した後、間違った行が削除されたようです。後で何をするのか少し説明できますか? –
したがって、 'checkoutButton'をタップすると、' checkoutButtonTapped'が呼び出されます。 'sender.tag'は行を最初に削除したときの正しい値です。たとえば、2行目のcheckoutButtonをタップすると、sender.tagは2になり、テーブルビューから2行目が削除されます。最初の削除後、sender.tagは正しい値ではなくなりました。たとえば、3行目と対話するかもしれませんが、 'sender.tag'値は4行目になります。 – luke
タグを使ってインデックスパスを表現しないでください。ここで見てきたように、テーブルビューで行を削除、挿入、または移動すると、残りのすべての行に間違ったインデックスパスタグが残ります。 – rmaddy