UITableViewCell, tampilkan tombol hapus saat geser

568

Bagaimana cara mendapatkan tombol hapus untuk ditampilkan saat menggesek pada UITableViewCell? Acara tidak pernah dinaikkan dan tombol hapus tidak pernah muncul.

Pembelajar
sumber
1
Siapa pun yang mencari jawaban terperinci dan diperbarui, gulir ke stackoverflow.com/a/37719543/6872794
Munib
Lihat jawaban Swift 4 saya untuk pertanyaan serupa yang menunjukkan hingga 3 cara berbeda untuk membuat swipe untuk menghapus tindakan untuk UITableViewCells.
Imanou Petit
Saya mengajukan pertanyaan ini 8 tahun yang lalu ... harap hapus pertanyaan ini karena sudah sangat ketinggalan zaman. Swift bahkan tidak ada!
TheLearner
dapatkah kita membuat perbaikan tinggi untuk tombol geser samping? misalnya: sel saya 150 dan saya ingin tombol hanya ditampilkan 50.0f apakah mungkin?
Suhas Arvind Patil
ini berfungsi dengan baik pada baris, tetapi ada petunjuk tentang cara mengintegrasikannya?
Frostmourne

Jawaban:

1035

Saat startup di (-viewDidLoad or in storyboard)lakukan:

self.tableView.allowsMultipleSelectionDuringEditing = NO;

Override untuk mendukung pengeditan bersyarat dari tampilan tabel. Ini hanya perlu diterapkan jika Anda akan kembali NOuntuk beberapa item. Secara default, semua item dapat diedit.

- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath {
    // Return YES if you want the specified item to be editable.
    return YES;
}

// Override to support editing the table view.
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
    if (editingStyle == UITableViewCellEditingStyleDelete) {
        //add code here for when you hit delete
    }    
}
Kurbz
sumber
94
Ini berfungsi, tetapi ... - (BOOL) tableView: (UITableView *) tableView canEditRowAtIndexPath: (NSIndexPath *) indexPath ... hanya perlu diimplementasikan jika Anda akan mengembalikan TIDAK untuk beberapa item. Secara default, semua item dapat diedit, jadi Anda tidak perlu mengimplementasikannya jika Anda selalu mengembalikan YA.
Thanos Diacakis
24
Juga penting untuk diketahui: ini adalah metode UITableViewDataSource dan BUKAN metode UITableViewDelegate.
Dave Albert
8
Ingin tahu bagaimana menerapkan penghapusan ?
ma11hew28
12
Untuk lebih jelasnya - Anda HARUS mengganti tableView: commitEditingStyle: forRowAtIndexPath: atau gerakan gesek tidak akan dikenali, dan tidak ada yang akan terjadi ketika Anda mencoba menghapus.
Chris
Ini tidak berhasil untuk saya (pada awalnya). Saya juga perlu mengatur self.tableView.allowsMultipleSelectionDuringEditing = NO;agar menggesek-kiri untuk bekerja. Ini kedengarannya seperti bug bagi saya karena tabel TIDAK dalam kondisi pengeditan. Opsi ini seharusnya hanya berlaku "DuringEditing". Namun, itu berfungsi sekarang dan saya mengaturnya ke YA setiap kali tabel memasuki kondisi pengeditan.
osxdirk
118

Jawaban ini telah diperbarui ke Swift 3

Saya selalu berpikir itu baik untuk memiliki contoh yang sangat sederhana, mandiri sehingga tidak ada yang dianggap ketika saya belajar tugas baru. Jawaban ini adalah untuk menghapus UITableViewbaris. Proyek melakukan seperti ini:

masukkan deskripsi gambar di sini

Proyek ini didasarkan pada contoh UITableView untuk Swift .

Tambahkan Kode

Buat proyek baru dan ganti kode ViewController.swift dengan yang berikut ini.

import UIKit
class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {

    // These strings will be the data for the table view cells
    var animals: [String] = ["Horse", "Cow", "Camel", "Pig", "Sheep", "Goat"]

    let cellReuseIdentifier = "cell"

    @IBOutlet var tableView: UITableView!

    override func viewDidLoad() {
        super.viewDidLoad()

        // It is possible to do the following three things in the Interface Builder
        // rather than in code if you prefer.
        self.tableView.register(UITableViewCell.self, forCellReuseIdentifier: cellReuseIdentifier)
        tableView.delegate = self
        tableView.dataSource = self
    }

    // number of rows in table view
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return self.animals.count
    }

    // create a cell for each table view row
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

        let cell:UITableViewCell = self.tableView.dequeueReusableCell(withIdentifier: cellReuseIdentifier) as UITableViewCell!

        cell.textLabel?.text = self.animals[indexPath.row]

        return cell
    }

    // method to run when table view cell is tapped
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        print("You tapped cell number \(indexPath.row).")
    }

    // this method handles row deletion
    func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {

        if editingStyle == .delete {

            // remove the item from the data model
            animals.remove(at: indexPath.row)

            // delete the table view row
            tableView.deleteRows(at: [indexPath], with: .fade)

        } else if editingStyle == .insert {
            // Not used in our example, but if you were adding a new row, this is where you would do it.
        }
    }

}

Metode kunci tunggal dalam kode di atas yang memungkinkan penghapusan baris adalah yang terakhir. Sekali lagi ini untuk penekanan:

// this method handles row deletion
func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {

    if editingStyle == .delete {

        // remove the item from the data model
        animals.remove(at: indexPath.row)

        // delete the table view row
        tableView.deleteRows(at: [indexPath], with: .fade)

    } else if editingStyle == .insert {
        // Not used in our example, but if you were adding a new row, this is where you would do it.
    }
}

Storyboard

Tambahkan UITableViewke View Controller di storyboard. Gunakan tata letak otomatis untuk menyematkan keempat sisi tampilan tabel ke tepi View Controller. Kendalikan kontrol dari tampilan tabel di storyboard ke @IBOutlet var tableView: UITableView!baris dalam kode.

Jadi

Itu saja. Anda seharusnya dapat menjalankan aplikasi Anda sekarang dan menghapus baris dengan menggesek ke kiri dan mengetuk "Hapus".


Variasi

Ubah teks tombol "Hapus"

masukkan deskripsi gambar di sini

Tambahkan metode berikut:

func tableView(_ tableView: UITableView, titleForDeleteConfirmationButtonForRowAt indexPath: IndexPath) -> String? {
    return "Erase"
}

Tindakan tombol kustom

masukkan deskripsi gambar di sini

Tambahkan metode berikut.

func tableView(_ tableView: UITableView, editActionsForRowAt indexPath: IndexPath) -> [UITableViewRowAction]? {

    // action one
    let editAction = UITableViewRowAction(style: .default, title: "Edit", handler: { (action, indexPath) in
        print("Edit tapped")
    })
    editAction.backgroundColor = UIColor.blue

    // action two
    let deleteAction = UITableViewRowAction(style: .default, title: "Delete", handler: { (action, indexPath) in
        print("Delete tapped")
    })
    deleteAction.backgroundColor = UIColor.red

    return [editAction, deleteAction]
}

Perhatikan bahwa ini hanya tersedia dari iOS 8. Lihat jawaban ini untuk detail lebih lanjut.

Diperbarui untuk iOS 11

Tindakan dapat ditempatkan memimpin atau mengekstraksi sel menggunakan metode yang ditambahkan ke API UITableViewDelegate di iOS 11.

func tableView(_ tableView: UITableView,
                leadingSwipeActionsConfigurationForRowAt indexPath: IndexPath) -> UISwipeActionsConfiguration?
 {
     let editAction = UIContextualAction(style: .normal, title:  "Edit", handler: { (ac:UIContextualAction, view:UIView, success:(Bool) -> Void) in
             success(true)
         })
editAction.backgroundColor = .blue

         return UISwipeActionsConfiguration(actions: [editAction])
 }

 func tableView(_ tableView: UITableView,
                trailingSwipeActionsConfigurationForRowAt indexPath: IndexPath) -> UISwipeActionsConfiguration?
 {
     let deleteAction = UIContextualAction(style: .normal, title:  "Delete", handler: { (ac:UIContextualAction, view:UIView, success:(Bool) -> Void) in
         success(true)
     })
     deleteAction.backgroundColor = .red

     return UISwipeActionsConfiguration(actions: [deleteAction])
 }

Bacaan lebih lanjut

Suragch
sumber
terima kasih untuk contoh & kode. Saya sekarang siap menerapkan fungsi hapus. Bisakah Anda memberi tahu saya apa tujuan dari baris "self.tableView.registerClass (..." yang Anda tambahkan ke viewDidLoad ()? Dan apa yang setara dengan itu di pembangun antarmuka? Itu tidak ada dalam contoh sel kustom. Sepertinya kami menetapkan cellReuseIdentifier dua kali sekarang. Terima kasih!
rockhammer
Jika termasuk baris .registerClass, kompilasi gagal
rockhammer
@rockhammer, Anda benar, Anda tidak perlu (tampaknya tidak bisa) mengatur pengidentifikasi ulang sel di kedua kode dan Pembuat Antarmuka. Cukup pilih satu cara sesuai dengan preferensi Anda. Meskipun proyek ini didasarkan pada bahwa dasar UITableViewsatu , ini adalah benar-benar berdiri proyek sendiri dan Anda tidak perlu melakukan apa-apa yang tidak dijelaskan di sini. Alasan saya mulai mengaturnya dalam kode adalah karena itu membutuhkan lebih sedikit penjelasan dalam jawaban saya. Saya harus kembali dan mengedit contoh dasar untuk menggunakan kode juga.
Suragch
Bagaimana cara menerapkan gesekan yang benar? Katakanlah sapuan kiri "menolak" sesuatu dan sapuan kanan "menerima" sesuatu di sel?
Munib
1
@ return0, sejauh yang saya tahu, fungsi swipe kanan tidak ada di dalamnya, jadi Anda harus membuatnya dari awal. Lihat artikel ini untuk mendapatkan ide untuk memulai jika Anda ingin mencoba. Namun, saya tidak akan merekomendasikan melakukan itu karena itu bukan tindakan standar yang diharapkan pengguna. Sebaliknya, saya akan menunjukkan dua pilihan tombol pada sapuan kiri seperti pada bagian tindakan tombol kustom di jawaban saya di atas.
Suragch
70

Kode ini menunjukkan bagaimana menerapkan penghapusan.

#pragma mark - UITableViewDataSource

// Swipe to delete.
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (editingStyle == UITableViewCellEditingStyleDelete) {
        [_chats removeObjectAtIndex:indexPath.row];
        [tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationAutomatic];
    }
}

Secara opsional, di inisialisasi inride Anda, tambahkan baris di bawah ini untuk menampilkan item tombol Edit:

self.navigationItem.leftBarButtonItem = self.editButtonItem;
ma11hew28
sumber
Anda perlu menerapkan metode itu. Konten di dalamnya harus cocok dengan apa pun yang masuk akal untuk kasus penggunaan Anda. Dalam kode di atas _chats adalah data backing untuk tampilan tabel. Setelah pengguna mengklik hapus, objek obrolan individual harus dihapus dari _chat sehingga sumber data kemudian akan mencerminkan jumlah baris baru (jika tidak ada pengecualian).
ewcy
25

Saya memiliki masalah yang baru saja berhasil saya selesaikan sehingga saya membaginya karena dapat membantu seseorang.

Saya memiliki UITableView dan menambahkan metode yang ditampilkan untuk mengaktifkan swipe untuk menghapus:

- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath {
    // Return YES if you want the specified item to be editable.
    return YES;
}

// Override to support editing the table view.
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
    if (editingStyle == UITableViewCellEditingStyleDelete) {
        //add code here for when you hit delete
    }    
}

Saya sedang mengerjakan pembaruan yang memungkinkan saya untuk menempatkan tabel ke mode edit dan memungkinkan multiselect. Untuk melakukan itu saya menambahkan kode dari sampel TableMultiSelect Apple . Setelah saya berhasil, saya menemukan bahwa swipe saya fungsi delete telah berhenti berfungsi.

Ternyata menambahkan baris berikut ke viewDidLoad adalah masalahnya:

self.tableView.allowsMultipleSelectionDuringEditing = YES;

Dengan baris ini, multiselect akan berfungsi tetapi gesekan untuk menghapus tidak akan. Tanpa garis itu sebaliknya.

Cara mengatasinya:

Tambahkan metode berikut ke viewController Anda:

- (void)setEditing:(BOOL)editing animated:(BOOL)animated
{
    self.tableView.allowsMultipleSelectionDuringEditing = editing; 
    [super setEditing:editing animated:animated];
}

Kemudian dalam metode Anda yang menempatkan tabel ke mode pengeditan (dari tombol tekan misalnya) Anda harus menggunakan:

[self setEditing:YES animated:YES];

dari pada:

[self.tableView setEditing:YES animated:YES];

Ini berarti multiselect hanya diaktifkan ketika tabel dalam mode pengeditan.

Leon
sumber
Ini sangat membantu. Saya telah mengatur allowMultiplePilih di Storyboard. Ini memperbaikinya.
Mark Suman
1
Ini telah memecahkan masalah yang membuat kami gila. Saya sekarang mengerti bahwa "swipe to delete" dan "bets deletion in edit mode" pada dasarnya saling eksklusif dan Anda harus mengontrolnya ketika memasuki / mengedit mode leavin. Terima kasih banyak telah meneliti ini!
fbitterlich
18

Di bawah UITableViewDataSource akan membantu Anda untuk menghapus usapan

- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath {
    // Return YES if you want the specified item to be editable.
    return YES;
}

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
    if (editingStyle == UITableViewCellEditingStyleDelete) {
        [arrYears removeObjectAtIndex:indexPath.row];
        [tableView reloadData];
    }
}

arrYears adalah NSMutableArray dan kemudian memuat kembali tableView

Cepat

 func tableView(tableView: UITableView, canEditRowAtIndexPath indexPath: NSIndexPath) -> Bool {
            return true
        }

func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) {
    if editingStyle == UITableViewCellEditingStyleDelete {
        arrYears.removeObjectAtIndex(indexPath.row)
        tableView.reloadData()
    }
}
iAnkit
sumber
Tetapi itu adalah UITableViewDataSource
HotJard
17

Di iOS 8 dan Swift 2.0 silakan coba ini,

override func tableView(tableView: UITableView, canEditRowAtIndexPath indexPath: NSIndexPath) -> Bool {
   // let the controller to know that able to edit tableView's row 
   return true
}

override func tableView(tableView: UITableView, commitEdittingStyle editingStyle UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath)  {
   // if you want to apply with iOS 8 or earlier version you must add this function too. (just left in blank code)
}

override func tableView(tableView: UITableView, editActionsForRowAtIndexPath indexPath: NSIndexPath) -> [UITableViewRowAction]?  {
   // add the action button you want to show when swiping on tableView's cell , in this case add the delete button.
   let deleteAction = UITableViewRowAction(style: .Default, title: "Delete", handler: { (action , indexPath) -> Void in

   // Your delete code here.....
   .........
   .........
   })

   // You can set its properties like normal button
   deleteAction.backgroundColor = UIColor.redColor()

   return [deleteAction]
}
Masa S-AiYa
sumber
Ini adalah jawaban yang baik, dengan ini Anda dapat mengatur beberapa tindakan juga.
Munib
11

@ Kurbz jawabannya luar biasa, tetapi saya ingin meninggalkan catatan ini dan berharap jawaban ini dapat menghemat waktu.

Saya kadang-kadang memiliki garis-garis ini di controller saya, dan mereka membuat fitur swiping tidak berfungsi.

- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath{
    return UITableViewCellEditingStyleNone; 
}

Jika Anda menggunakan UITableViewCellEditingStyleInsertatau UITableViewCellEditingStyleNonesebagai gaya pengeditan, maka fitur swiping tidak berfungsi. Anda hanya dapat menggunakan UITableViewCellEditingStyleDelete, yang merupakan gaya default.

Brian
sumber
1
Dalam kasus saya, saya ingin dapat menggesek untuk menghapus, tetapi kemudian juga dapat memindahkan sel saya. Sel bergerak juga mendapat tombol "hapus" ini di sisi kiri sel, yang tidak sesuai dengan desain saya dan untuk menghapus ini gaya pengeditan seharusnya .none. Saya memecahkan masalah ini dengan "if tableView.isEditing {return .none} else {return .delete}"
Menyimpan Bung Axz saya. Terima kasih :)
Sourav Chandra
9

Cepat 4

func tableView(_ tableView: UITableView, editActionsForRowAt indexPath: IndexPath) -> [UITableViewRowAction]? {
    let delete = UITableViewRowAction(style: .destructive, title: "delete") { (action, indexPath) in
        // delete item at indexPath
    tableView.deleteRows(at: [indexPath], with: .fade)

    }
    return [delete]
}
Pratik Lad
sumber
1
Ok ini membuat tab hapus muncul, tetapi tidak menghapusnya saat Anda menekannya. Anda perlu menghapus objek di sumber data dan memuat ulang tabel ya?
user3069232
ya "// delete item at indexPath" tempatkan logika baris penghapusan Anda berdasarkan indexPath
Pratik Lad
8

Juga, ini dapat dicapai dalam SWIFT menggunakan metode sebagai berikut

func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) {
    if (editingStyle == UITableViewCellEditingStyle.Delete){
        testArray.removeAtIndex(indexPath.row)
        goalsTableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: UITableViewRowAnimation.Automatic)
    }
}
DrPatience
sumber
8

Cepat 3

Yang harus Anda lakukan adalah mengaktifkan dua fungsi ini:

func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool {

    return true

}

func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {

    if editingStyle == UITableViewCellEditingStyle.delete {
        tableView.reloadData()
    }

}
Machado
sumber
7

Saya tahu ini adalah pertanyaan lama, tetapi jawaban @Kurbz hanya membutuhkan ini untuk Xcode 6.3.2 dan SDK 8.3

Saya perlu menambahkan [tableView beginUpdates]dan [tableView endUpdates](terima kasih ke @ bay.phillips di sini )

// Override to support editing the table view.
- (void)tableView:(UITableView *)tableView commitEditingStyle: (UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
    // Open "Transaction"
    [tableView beginUpdates];

    if (editingStyle == UITableViewCellEditingStyleDelete) {
        // your code goes here
        //add code here for when you hit delete
        [tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];
     }

    // Close "Transaction"
    [tableView endUpdates];
}
Beto
sumber
6

Ketika Anda menghapus sel tampilan tabel Anda, Anda juga harus menghapus objek array Anda di indeks x.

Saya pikir Anda dapat menghapusnya dengan menggunakan gerakan menggesek. Tampilan tabel akan memanggil Delegasi:

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
    if (editingStyle == UITableViewCellEditingStyleDelete) {
        //add code here for when you hit delete
        [dataSourceArray removeObjectAtIndex:indexPath.row];
    }    
}

Setelah menghapus objek. Anda harus memuat ulang penggunaan tampilan tabel. Tambahkan baris berikut dalam kode Anda:

[tableView reloadData];

setelah itu, Anda berhasil menghapus baris. Dan ketika Anda memuat ulang tampilan atau menambahkan data ke DataSource objek tidak akan ada lagi.

Untuk semua yang lain adalah jawaban dari Kurbz benar.

Saya hanya ingin mengingatkan Anda bahwa fungsi delegasi tidak akan cukup jika Anda ingin menghapus objek dari array DataSource.

Saya harap saya telah membantu Anda.

Robybyte
sumber
4
Alih-alih memanggil [tableView reloadData]panggilan [tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationAutomatic].
ma11hew28
6
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath 
{
    if (editingStyle == UITableViewCellEditingStyleDelete)
    {
        //add code here for when you hit delete
        [dataSourceArray removeObjectAtIndex:indexPath.row];
        [tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationAutomatic];
    }    
}    
Rahul K Rajan
sumber
dataSourceArray adalah array dari mana konten sel berasal
Rahul K Rajan
2

Swift 2.2:

override func tableView(tableView: UITableView, canEditRowAtIndexPath indexPath: NSIndexPath) -> Bool {
    return true
}

override func tableView(tableView: UITableView,
    editActionsForRowAtIndexPath indexPath: NSIndexPath) -> [UITableViewRowAction]? {
    let delete = UITableViewRowAction(style: UITableViewRowActionStyle.Default, title: "DELETE"){(UITableViewRowAction,NSIndexPath) -> Void in

    print("Your action when user pressed delete")
}
let edit = UITableViewRowAction(style: UITableViewRowActionStyle.Normal, title: "EDIT"){(UITableViewRowAction,NSIndexPath) -> Void in

    print("Your action when user pressed edit")
}
    return [delete, block]
}
lcl
sumber
2

Untuk Swift, Cukup tulis kode ini

func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) {
        if editingStyle == .Delete {
            print("Delete Hit")
        }
}

Untuk Objective C, Cukup tulis kode ini

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
       if (editingStyle == UITableViewCellEditingStyleDelete) {           
            NSLog(@"index: %@",indexPath.row);
           }
}
Kiran Jasvanee
sumber
2

untuk kode swift4, pertama-tama aktifkan pengeditan:

func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool {
    return true
}

maka Anda menambahkan tindakan hapus ke delegasi edit:

func tableView(_ tableView: UITableView, editActionsForRowAt indexPath: IndexPath) -> [UITableViewRowAction]? {
    let action = UITableViewRowAction(style: .destructive, title: "Delete") { (_, index) in
        // delete model object at the index
        self.models[index.row]
        // then delete the cell
        tableView.beginUpdates()
        tableView.deleteRows(at: [index], with: .automatic)
        tableView.endUpdates()

    }
    return [action]
}
Abdoelrhman
sumber
0

Cepat 4,5

Untuk menghapus sel di swipe ada dua metode UITableView.Write dibangun metode ini dalam ekstensi TableView dataSource.

func tableView(_ tableView: UITableView, trailingSwipeActionsConfigurationForRowAt indexPath: IndexPath) -> UISwipeActionsConfiguration? {
        let delete = deleteProperty(at: indexPath)
        return UISwipeActionsConfiguration(actions: [delete])
    }

//Declare this method in Viewcontroller Main and modify according to your need

func deleteProperty(at indexpath: IndexPath) -> UIContextualAction {
        let action = UIContextualAction(style: .destructive, title: "Delete") { (action, view, completon) in
            self.yourArray.remove(at: indexpath) //Removing from array at selected index

            completon(true)
        action.backgroundColor = .red //cell background color
    }
        return action
    }
MALIKK HABIB UR REHMAN
sumber
0

Jika Anda mengadopsi sumber data difabel, Anda harus memindahkan delegasi panggilan balik ke UITableViewDiffableDataSourcesubkelas. Sebagai contoh:

class DataSource: UITableViewDiffableDataSource<SectionType, ItemType> {

    override func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool {
        return true
    }

    override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) {
        if editingStyle == .delete {
            if let identifierToDelete = itemIdentifier(for: indexPath) {
                var snapshot = self.snapshot()
                snapshot.deleteItems([identifierToDelete])
                apply(snapshot)
            }
        }
    }
}
Austin Conlon
sumber