Bir kaydırırken silme düğmesini nasıl gösterebilirim UITableViewCell
? Etkinlik asla yükseltilmez ve sil düğmesi hiçbir zaman görünmez.
UITableViewCell
.
Bir kaydırırken silme düğmesini nasıl gösterebilirim UITableViewCell
? Etkinlik asla yükseltilmez ve sil düğmesi hiçbir zaman görünmez.
UITableViewCell
.
Yanıtlar:
Başlangıç sırasında (-viewDidLoad or in storyboard)
:
self.tableView.allowsMultipleSelectionDuringEditing = NO;
Tablo görünümünün koşullu düzenlenmesini desteklemek için geçersiz kıl. Bu, yalnızca NO
bazı öğeler için iade ediyorsanız uygulanmalıdır . Varsayılan olarak, tüm öğeler düzenlenebilir.
- (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;
sol kaydırma hareketinin çalışması için ayar yapmam gerekiyordu . Bu benim için bir hata gibi geliyor çünkü tablo düzenleme durumunda DEĞİL. Bu seçenek yalnızca "Düzenleme Sırasında" uygulanmalıdır. Ancak, şimdi çalışıyor ve tablo düzenleme durumuna her girdiğinde bunu EVET olarak ayarladım.
Bu cevap Swift 3 olarak güncellendi
Her zaman çok basit, müstakil bir örneğe sahip olmanın iyi olduğunu düşünüyorum, böylece yeni bir görev öğrenirken hiçbir şey varsayılmıyor. Bu cevap UITableView
satırları silmek içindir . Proje şu şekilde çalışır:
Bu proje Swift için UITableView örneğine dayanmaktadır .
Yeni bir proje oluşturun ve ViewController.swift kodunu aşağıdaki ile değiştirin.
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.
}
}
}
Yukarıdaki kodda satır silmeyi sağlayan tek tuş yöntemi sonuncudur. İşte yine vurgulamak için:
// 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.
}
}
UITableView
Film şeridindeki Görünüm Denetleyicisine bir ekleyin . Tablo görünümünün dört tarafını Görünüm Denetleyicisinin kenarlarına sabitlemek için otomatik düzeni kullanın. Film şeridindeki tablo görünümünden @IBOutlet var tableView: UITableView!
koddaki satıra sürükleyin .
Bu kadar. Uygulamanızı şimdi çalıştırabilir ve sola hızlıca kaydırarak ve "Sil" e hafifçe vurarak satırları silebilirsiniz.
"Sil" düğmesi metnini değiştirme
Aşağıdaki yöntemi ekleyin:
func tableView(_ tableView: UITableView, titleForDeleteConfirmationButtonForRowAt indexPath: IndexPath) -> String? {
return "Erase"
}
Özel düğme eylemleri
Aşağıdaki yöntemi ekleyin.
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]
}
Bunun yalnızca iOS 8'de mevcut olduğunu unutmayın. Daha fazla ayrıntı için bu cevaba bakın.
İOS 11 için güncellendi
Eylemler, iOS 11'deki UITableViewDelegate API'sine eklenen yöntemler kullanılarak hücreye öncülük edebilir veya onu takip edebilir.
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
birinde , bu tamamen stand alone projedir ve burada açıklanmayan bir şey yapmak gerekmez. Kodda ayarlamaya başlamamın nedeni, cevaplarımda daha az açıklama gerektirmesidir. Geri dönüp kod da kullanmak için temel örnek düzenlemek gerekir.
Bu kod, silme işleminin nasıl uygulanacağını gösterir.
#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];
}
}
İsteğe bağlı olarak, başlatma geçersiz kılmanızda, Düzenle düğmesi öğesini göstermek için aşağıdaki satırı ekleyin:
self.navigationItem.leftBarButtonItem = self.editButtonItem;
Çözmeyi başardığım bir sorun yaşadım, bu yüzden birisine yardımcı olabileceği için paylaşıyorum.
Bir UITableView var ve silmek için tokatlamak etkinleştirmek için gösterilen yöntemleri ekledi:
- (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
}
}
Tablo düzenleme moduna koymak ve çoklu seçim sağlayan bir güncelleme üzerinde çalışıyorum. Bunu yapmak için Apple'ın TableMultiSelect kodunu ekledim örneğindeki . Bu çalışmayı aldıktan sonra, silme işlevimin çalışmayı durdurduğunu buldum.
ViewDidLoad'a aşağıdaki satırı eklemenin sorun olduğu ortaya çıktı:
self.tableView.allowsMultipleSelectionDuringEditing = YES;
Bu satır girildiğinde, çoklu seçim işe yarayacak, ancak silmek için hızlıca kaydırma hareketi çalışmaz. Çizgi olmadan bu tam tersi oldu.
Çözüm:
ViewController'ınıza aşağıdaki yöntemi ekleyin:
- (void)setEditing:(BOOL)editing animated:(BOOL)animated
{
self.tableView.allowsMultipleSelectionDuringEditing = editing;
[super setEditing:editing animated:animated];
}
Ardından, tabloyu düzenleme moduna getiren yönteminizde (örneğin bir düğmeye basarak) şunları kullanmalısınız:
[self setEditing:YES animated:YES];
onun yerine:
[self.tableView setEditing:YES animated:YES];
Bu, çoklu seçimin yalnızca tablo düzenleme modundayken etkinleştirildiği anlamına gelir.
Aşağıda UITableViewDataSource tokatlamak silmek için yardımcı olacaktır
- (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 bir NSMutableArray ve sonra tableView yeniden
hızlı
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()
}
}
İOS 8 ve Swift 2.0'da lütfen bunu deneyin,
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'un cevabı harika, ama bu notu bırakmak istiyorum ve bu cevabın insanları biraz zaman kazandıracağını umuyorum.
Bazen bu satırları denetleyicimde tuttum ve kaydırma özelliğini çalıştıramadılar.
- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath{
return UITableViewCellEditingStyleNone;
}
Düzenleme stili olarak UITableViewCellEditingStyleInsert
veya kullanıyorsanız UITableViewCellEditingStyleNone
, kaydırma özelliği çalışmaz. Yalnızca UITableViewCellEditingStyleDelete
varsayılan stil olan kullanabilirsiniz .
Hızlı 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]
}
Ayrıca bu, SWIFT'de aşağıdaki yöntem kullanılarak elde edilebilir.
func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) {
if (editingStyle == UITableViewCellEditingStyle.Delete){
testArray.removeAtIndex(indexPath.row)
goalsTableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: UITableViewRowAnimation.Automatic)
}
}
Tek yapmanız gereken şu iki işlevi etkinleştirmektir:
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()
}
}
Biliyorum eski soru, ama @Kurbz cevap sadece Xcode 6.3.2 ve SDK 8.3 için buna ihtiyacım var
Ben eklemek gerek [tableView beginUpdates]
ve [tableView endUpdates]
(sayesinde @ bay.phillips burada )
// 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];
}
Tablo görünümünüzün bir hücresini kaldırdığınızda, dizin nesnenizi x dizininden de kaldırmanız gerekir.
Kaydırma hareketi kullanarak kaldırabileceğinizi düşünüyorum. Tablo görünümü Temsilci'yi arayacaktır:
- (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];
}
}
Nesneyi çıkardıktan sonra. Tableview kullanımını yeniden yüklemelisiniz. Kodunuza aşağıdaki satırı ekleyin:
[tableView reloadData];
bundan sonra satırı başarıyla sildiniz. Görünümü yeniden yüklediğinizde veya DataSource'a veri eklediğinizde nesne artık orada olmayacaktır.
Diğerleri için Kurbz'dan gelen cevap doğru.
Yalnızca nesneyi DataSource dizisinden kaldırmak istiyorsanız, temsilci işlevinin yeterli olmayacağını hatırlatmak istedim.
Umarım sana yardım etmişimdir.
[tableView reloadData]
Arama yapmak yerine [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];
}
}
Hızlı 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]
}
Swift için, sadece bu kodu yaz
func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) {
if editingStyle == .Delete {
print("Delete Hit")
}
}
Amaç C için, sadece bu kodu yazın
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
if (editingStyle == UITableViewCellEditingStyleDelete) {
NSLog(@"index: %@",indexPath.row);
}
}
swift4 kodu için önce düzenlemeyi etkinleştirin:
func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool {
return true
}
ardından düzenleme temsilcisine silme işlemi eklersiniz:
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]
}
Hızlı 4,5
Hızlıca kaydırıldığında bir hücreyi silmek için iki yerleşik UITableView yöntemi vardır.
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
}
Değişken veri kaynaklarını benimsiyorsanız, temsilci geri çağrılarını bir UITableViewDiffableDataSource
alt sınıfa taşımanız gerekir . Örneğin:
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)
}
}
}
}