Bagaimana cara mendapatkan tombol hapus untuk ditampilkan saat menggesek pada UITableViewCell
? Acara tidak pernah dinaikkan dan tombol hapus tidak pernah muncul.
UITableViewCell
s.
Bagaimana cara mendapatkan tombol hapus untuk ditampilkan saat menggesek pada UITableViewCell
? Acara tidak pernah dinaikkan dan tombol hapus tidak pernah muncul.
UITableViewCell
s.
Jawaban:
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 NO
untuk 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
}
}
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.
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 UITableView
baris. Proyek melakukan seperti ini:
Proyek ini didasarkan pada contoh UITableView untuk Swift .
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.
}
}
Tambahkan UITableView
ke 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.
Itu saja. Anda seharusnya dapat menjalankan aplikasi Anda sekarang dan menghapus baris dengan menggesek ke kiri dan mengetuk "Hapus".
Ubah teks tombol "Hapus"
Tambahkan metode berikut:
func tableView(_ tableView: UITableView, titleForDeleteConfirmationButtonForRowAt indexPath: IndexPath) -> String? {
return "Erase"
}
Tindakan tombol kustom
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])
}
UITableView
satu , 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.
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;
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.
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()
}
}
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]
}
@ 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 UITableViewCellEditingStyleInsert
atau UITableViewCellEditingStyleNone
sebagai gaya pengeditan, maka fitur swiping tidak berfungsi. Anda hanya dapat menggunakan UITableViewCellEditingStyleDelete
, yang merupakan gaya default.
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]
}
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)
}
}
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()
}
}
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];
}
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.
[tableView reloadData]
panggilan [tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationAutomatic]
.
- (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];
}
}
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]
}
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);
}
}
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]
}
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
}
Jika Anda mengadopsi sumber data difabel, Anda harus memindahkan delegasi panggilan balik ke UITableViewDiffableDataSource
subkelas. 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)
}
}
}
}