UITableView nonaktifkan gesek untuk menghapus, tetapi masih ada hapus dalam mode Edit?

91

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?

willi
sumber

Jawaban:

287

Ok, ternyata cukup mudah. Inilah yang saya lakukan untuk menyelesaikan ini:

Objective-C

- (UITableViewCellEditingStyle)tableView:(UITableView *)aTableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath
{
    // Detemine if it's in editing mode
    if (self.tableView.editing)
    {
        return UITableViewCellEditingStyleDelete;
    }

    return UITableViewCellEditingStyleNone;
}

Cepat 2

override func tableView(tableView: UITableView, editingStyleForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCellEditingStyle {
    if tableView.editing {
         return .Delete
    }

    return .None
}

Cepat 3

override func tableView(_ tableView: UITableView, editingStyleForRowAt indexPath: IndexPath) -> UITableViewCellEditingStyle {
    if tableView.isEditing {
        return .delete
    }

    return .none
}

Anda masih perlu menerapkan tableView:commitEditingStyle:forRowAtIndexPath:untuk melakukan penghapusan.

willi
sumber
bu kemudian gesek untuk menghapus secara otomatis diaktifkan, lagi. Atau tidak?
Massimo Cafaro
Tidak, gesek untuk menghapus tidak diaktifkan, jika tidak dalam mode pengeditan. Itulah mengapa saya mengembalikan UITableViewCellEditingStyleNone sebagai default.
Willi
3
Lupa menyebutkan bahwa Anda perlu jika (editingStyle == UITableViewCellEditingStyleDelete) dalam commitEditingStyle:
willi
Ok, dengan pernyataan ini Anda mendapat tindakan hapus tetapi memiliki visualitas yang berbeda. Apakah ada kemungkinan untuk melakukan tindakan itu dengan visualitas versi gesek yang sama?
Göktuğ Aral
@ Giuspe Tidak masalah. Dia tidak salah dengan merujuk kembali pada diri sendiri. Metode delegasi itu merujuk kembali ke tableView yang sama sehingga dia boleh menggunakan salah satu atau.
Stephen Paul
9

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.

Marc Rochkind
sumber
4

Versi Swift:

override func tableView(tableView: UITableView, editingStyleForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCellEditingStyle {

    if(do something){

        return UITableViewCellEditingStyle.Delete or UITableViewCellEditingStyle.Insert

    }
    return UITableViewCellEditingStyle.None

}
kareem
sumber
4

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
}
Noodybrank
sumber
2

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.

Massimo Cafaro
sumber
1
Saya menyelesaikan ini dengan mengembalikan UITableViewCellEditingStyleDelete di tableView: editingStyleForRowAtIndexPath: jika dalam mode pengeditan.
Willi
0

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.

AG
sumber
0

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
}

}

pengguna4272677
sumber