Як отримати так, щоб кнопка "Видалити" відображалася під час переходу на A UITableViewCell
? Подія ніколи не піднімається, а кнопка видалення ніколи не з’являється.
UITableViewCell
s.
Як отримати так, щоб кнопка "Видалити" відображалася під час переходу на A UITableViewCell
? Подія ніколи не піднімається, а кнопка видалення ніколи не з’являється.
UITableViewCell
s.
Відповіді:
Під час запуску в (-viewDidLoad or in storyboard)
:
self.tableView.allowsMultipleSelectionDuringEditing = NO;
Замініть, щоб підтримати умовне редагування подання таблиці. Це потрібно здійснити лише в тому випадку, якщо ви збираєтеся повертатися NO
за деякими предметами. За замовчуванням усі елементи можна редагувати.
- (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;
щоб пальцем ліворуч працював. Це звучить як помилка для мене, оскільки таблиця НЕ в стані редагування. Ця опція повинна застосовуватися лише у "Під час редагування". Однак він працює зараз, і я встановлюю його ТАК, коли таблиця переходить у стан редагування.
Цю відповідь було оновлено Swift 3
Я завжди думаю, що приємно мати дуже простий, автономний приклад, щоб нічого не припускати, коли я навчаюсь новим завданням. Ця відповідь полягає у видаленні UITableView
рядків. Проект працює так:
Цей проект заснований на прикладі UITableView для Swift .
Створіть новий проект та замініть код ViewController.swift наступним.
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.
}
}
}
Метод з одним ключем у наведеному вище коді, який дозволяє видалити рядок, є останнім. Тут знову наголос:
// 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
до контролера перегляду в дошці повідомлень. Використовуйте автоматичний макет, щоб закріпити чотири сторони подання таблиці до країв контролера подання. Керуйте перетягуванням з подання таблиці на дошці розкадрування до @IBOutlet var tableView: UITableView!
рядка в коді.
Це все. Ви повинні мати змогу запустити додаток зараз та видалити рядки, провевши пальцем ліворуч та торкнувшись "Видалити".
Змініть текст кнопки «Видалити»
Додайте наступний метод:
func tableView(_ tableView: UITableView, titleForDeleteConfirmationButtonForRowAt indexPath: IndexPath) -> String? {
return "Erase"
}
Спеціальні дії кнопки
Додайте наступний метод.
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]
}
Зауважте, що це доступно лише в iOS 8. Детальну інформацію див. У цій відповіді .
Оновлено для iOS 11
Дії можна розміщувати як на передній, так і на тривалій комірці, використовуючи методи, додані до API UITableViewDelegate в 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
один , це абсолютно самостійний проект , і вам не потрібно нічого робити, не описані тут. Причина, яку я почав встановлювати в коді, полягає в тому, що в моїх відповідях потрібно менше пояснень. Я повинен повернутися назад і відредагувати основний приклад, щоб також використовувати код.
Цей код показує, як реалізувати видалення.
#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];
}
}
Необов’язково, перезазначивши ініціалізацію, додайте рядок нижче, щоб відобразити елемент кнопки Редагувати:
self.navigationItem.leftBarButtonItem = self.editButtonItem;
У мене виникла проблема, яку я щойно вдалося вирішити, тому я ділюсь нею, як це може комусь допомогти.
У мене є UITableView і додав показані методи, які дозволяють пальцем видалити:
- (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
}
}
Я працюю над оновленням, яке дозволяє мені переводити таблицю в режим редагування і дозволяє багатоцільовий вибір. Для цього я додав код із зразка Apple TableMultiSelect від Apple . Як тільки я працював, я виявив, що мій пальцем функція видалення перестала працювати.
Виявляється, проблемою було додавання наступного рядка до viewDidLoad:
self.tableView.allowsMultipleSelectionDuringEditing = YES;
Якщо цей рядок введений, мультиселекція буде працювати, але проведіть пальцем, щоб видалити, не буде. Без лінії було навпаки.
Виправлення:
Додайте такий спосіб у свій viewController:
- (void)setEditing:(BOOL)editing animated:(BOOL)animated
{
self.tableView.allowsMultipleSelectionDuringEditing = editing;
[super setEditing:editing animated:animated];
}
Потім у вашому методі, який переводить таблицю в режим редагування (наприклад, натисканням кнопки), слід використовувати:
[self setEditing:YES animated:YES];
замість:
[self.tableView setEditing:YES animated:YES];
Це означає, що мультиселекція ввімкнена лише тоді, коли таблиця знаходиться в режимі редагування.
Нижче UITableViewDataSource допоможе вам провести пальцем видалення
- (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 - це NSMutableArray, а потім перезавантажте tableView
Швидкий
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()
}
}
У iOS 8 та Swift 2.0 спробуйте це,
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]
}
@ Відповідь Курбза є приголомшливою, але я хочу залишити цю замітку і сподіваюся, що ця відповідь може врятувати людей деякий час.
У мене періодично були ці рядки в контролері, і вони зробили, що функція перемикання не працює.
- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath{
return UITableViewCellEditingStyleNone;
}
Якщо ви використовуєте UITableViewCellEditingStyleInsert
або UITableViewCellEditingStyleNone
як стиль редагування, функція перемикання не працює. Ви можете використовувати лише те UITableViewCellEditingStyleDelete
, що є типовим стилем.
Швидкий 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]
}
Також цього можна досягти в SWIFT, використовуючи наступний метод
func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) {
if (editingStyle == UITableViewCellEditingStyle.Delete){
testArray.removeAtIndex(indexPath.row)
goalsTableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: UITableViewRowAnimation.Automatic)
}
}
Все, що вам потрібно зробити, це включити ці дві функції:
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()
}
}
Я знаю, це старе питання, але відповідь @Kurbz просто потрібна для Xcode 6.3.2 та SDK 8.3
Мені потрібно додати [tableView beginUpdates]
і [tableView endUpdates]
(завдяки @ bay.phillips тут )
// 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];
}
Коли ви вилучаєте комірку перегляду таблиці, вам також доведеться видалити об’єкт масиву в індексі x.
Я думаю, ви можете видалити його за допомогою пальця жестом. Перегляд таблиці зателефонує Делегату:
- (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 reloadData];
після цього ви успішно видалили рядок. І коли ви перезавантажите подання або додасте дані до DataSource, об’єкт більше не буде.
З усіх інших правильна відповідь Курбца.
Я хотів лише нагадати вам, що функції делегування буде недостатньо, якщо ви хочете видалити об'єкт з масиву DataSource.
Я сподіваюся, що я вам допоміг.
[tableView reloadData]
дзвінок [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];
}
}
Швидкий 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 просто напишіть цей код
func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) {
if editingStyle == .Delete {
print("Delete Hit")
}
}
Для Цілі C просто напишіть цей код
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
if (editingStyle == UITableViewCellEditingStyleDelete) {
NSLog(@"index: %@",indexPath.row);
}
}
для коду swift4 спочатку ввімкніть редагування:
func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool {
return true
}
потім ви додаєте дію видалення до делегата редагування:
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]
}
Швидкий 4,5
Для видалення комірки при проведенні пальцем є два вбудовані методи UITableView.Запишіть цей метод у розширення 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
}
Якщо ви приймаєте різні джерела даних, вам доведеться перемістити зворотні делегатні виклики до UITableViewDiffableDataSource
підкласу. Наприклад:
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)
}
}
}
}