Saya menginginkan sesuatu yang mirip dengan aplikasi Alarm, di mana Anda tidak dapat menggeser menghapus baris, tetapi Anda masih dapat menghapus baris dalam mode Edit.
Saat memberi komentar tableView: commitEditingStyle: forRowAtIndexPath :, saya menonaktifkan gesekan untuk menghapus dan masih memiliki tombol Hapus dalam mode Edit, tetapi apa yang terjadi ketika saya menekan tombol Hapus. Disebut apa?
ios
cocoa-touch
uitableview
uikit
willi
sumber
sumber
Hanya untuk memperjelas, geser-untuk-hapus tidak akan diaktifkan kecuali
tableView:commitEditingStyle:forRowAtIndexPath:
diterapkan.Saat saya dalam pengembangan, saya tidak mengimplementasikannya, dan karena itu swipe-to-delete tidak diaktifkan. Tentu saja, dalam aplikasi yang sudah selesai, itu akan selalu diimplementasikan, karena jika tidak, tidak akan ada pengeditan.
sumber
Versi Swift:
override func tableView(tableView: UITableView, editingStyleForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCellEditingStyle { if(do something){ return UITableViewCellEditingStyle.Delete or UITableViewCellEditingStyle.Insert } return UITableViewCellEditingStyle.None }
sumber
Anda perlu menerapkan fungsi CanEditRowAt.
Anda dapat mengembalikan .delete dalam fungsi EditingStyleForRowAt sehingga Anda masih dapat menghapus dalam mode pengeditan.
func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool { if tableView.isEditing { return true } return false } func tableView(_ tableView: UITableView, editingStyleForRowAt indexPath: IndexPath) -> UITableViewCell.EditingStyle { return .delete }
sumber
Pada dasarnya, Anda mengaktifkan atau menonaktifkan pengeditan menggunakan metode
- (void)setEditing:(BOOL)editing animated:(BOOL)animated
Jika pengeditan diaktifkan, ikon penghapusan merah muncul, dan konfirmasi penghapusan diminta kepada pengguna. Jika pengguna mengkonfirmasi, metode delegasi
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
diberitahu tentang permintaan hapus. Jika Anda menerapkan metode ini, geser untuk menghapus secara otomatis menjadi aktif. Jika Anda tidak menerapkan metode ini, gesek untuk menghapus tidak aktif, namun Anda tidak dapat benar-benar menghapus baris tersebut. Oleh karena itu, sejauh pengetahuan saya, Anda tidak dapat mencapai apa yang Anda minta, kecuali menggunakan beberapa API pribadi yang tidak berdokumen. Mungkin begitulah penerapan aplikasi Apple.
sumber
Pada C #:
Saya memiliki masalah yang sama di mana diperlukan untuk mengaktifkan / menonaktifkan baris dengan opsi Hapus saat menggesek. Beberapa baris perlu digesek ke kiri dan dihapus, pertahankan dengan warna lain. Saya berhasil menggunakan logika ini.
[Export("tableView:canEditRowAtIndexPath:")] public bool CanEditRow(UITableView tableView, NSIndexPath indexPath) { if (deletedIndexes.Contains(indexPath.Row)){ return false; } else{ return true; } }
Perhatikan bahwa deleteIndexes adalah daftar indeks yang dihapus dari tabel tanpa duplikat. Kode ini memeriksa apakah sebuah baris dihapus, kemudian menonaktifkan gesekan atau sebaliknya.
Fungsi delegasi yang setara adalah Swift is
canEditRowAtIndexPath
.sumber
Saya juga menemukan masalah ini dan memperbaikinya dengan kode di bawah ini. berharap ini akan membantu Anda.
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath { if (editingStyle == UITableViewCellEditingStyleDelete) { BOOL deleteBySwipe = NO; for (UIGestureRecognizer* g in tableView.gestureRecognizers) { if (g.state == UIGestureRecognizerStateEnded) { deleteBySwipe = YES; break; } } if (deleteBySwipe) { //this gesture may cause delete unintendedly return; } //do delete }
}
sumber