Как включить смахивание, чтобы удалить ячейку в TableView? - PullRequest
74 голосов
/ 24 января 2012

У меня есть UIViewController, который реализует делегаты TableViews и источники данных . Теперь я хочу добавить жест «Размах для удаления» к ячейкам.

Как мне поступить?

Я дал пустую реализацию метода commitEditingStyle, а также установил для свойства Editing значение YES.

Тем не менее функция прокрутки не работает.

Теперь нужно ли отдельно добавлять UISwipeGesture в каждую ячейку?

Или я что-то упустил?

Ответы [ 13 ]

61 голосов
/ 07 октября 2013

Поскольку Dan прокомментировал выше, вам необходимо реализовать следующие методы делегата табличного представления:

  1. tableView:canEditRowAtIndexPath:
  2. tableView:commitEditingStyle:forRowAtIndexPath:

Примечание: я пробовал это в iOS 6 и iOS 7.

- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath
{
    // Return YES - we will be able to delete all rows
    return YES;
}

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{
    // Perform the real delete action here. Note: you may need to check editing style
    //   if you do not perform delete only.
    NSLog(@"Deleted row.");
}
53 голосов
/ 24 января 2012

Вам не нужно устанавливать editing:YES, если вам нужно показать кнопку «Удалить» при пролистывании ячейки. Вы должны реализовать tableView:canEditRowAtIndexPath: и вернуть YES оттуда для строк, которые нужно отредактировать / удалить. В этом нет необходимости, когда dataSource вашего tableView является подклассом UITableViewContoller - этот метод, если не переопределен, возвращает YES по умолчанию. Во всех остальных случаях вы должны это реализовать.

РЕДАКТИРОВАТЬ: Вместе мы нашли проблему - tableView:editingStyleForRowAtIndexPath: вернул UITableViewCellEditingStyleNone, если таблица не была в режиме редактирования.

25 голосов
/ 15 декабря 2013
// Override to support conditional editing of the table view.
- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath
{
    // Return NO if you do not 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) {
        // Delete the row from the data source
        [tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];
    }   
    else if (editingStyle == UITableViewCellEditingStyleInsert) {
        // Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view
    }   
}
13 голосов
/ 08 июля 2015

Пожалуйста, попробуйте этот код в быстром,

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, commitEditingStyle 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]
}
5 голосов
/ 24 января 2012

Попробуйте добавить в свой класс следующее:

// Override to support conditional editing of the table view.
- (BOOL) tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath
{
    return(YES);
}
3 голосов
/ 14 июня 2013

Заключение Kyr Dunenkoff chat is

- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath {

}

не должно быть определено, если вам нужна кнопка удаления, чтобы появиться на свайпе.

1 голос
/ 18 февраля 2016

Если вы используете NSFetchedResultsControllerDelegate для заполнения табличного представления, это работает для меня:

  • Убедитесь, что tableView:canEditRowAtIndexPath всегда возвращает true
  • В вашемtableView:commitEditingStyle:forRowAtIndexPath реализация, не удаляйте строку непосредственно из табличного представления.Вместо этого удалите его, используя контекст управляемого объекта, например:

    if editingStyle == UITableViewCellEditingStyle.Delete {
        let word = self.fetchedResultsController.objectAtIndexPath(indexPath) as! Word
        self.managedObjectContext.deleteObject(word)
        self.saveManagedObjectContext()
    }
    
    func saveManagedObjectContext() {
        do {
            try self.managedObjectContext.save()
        } catch {
            let saveError = error as NSError
            print("\(saveError), \(saveError.userInfo)")
        }
    }
    
0 голосов
/ 04 января 2017

После iOS 8.0 вы можете настроить свое действие в

- (nullable NSArray<UITableViewRowAction *> *)tableView:(UITableView *)tableView editActionsForRowAtIndexPath:(NSIndexPath *)indexPath
0 голосов
/ 09 июня 2016

По моему опыту, вы должны иметь editing на UITableView, установленном на NO для работы с пальцами.

self.tableView.editing = NO;

0 голосов
/ 06 мая 2015

Это быстрая версия

// Override to support conditional editing of the table view.
override func tableView(tableView: UITableView, canEditRowAtIndexPath indexPath: NSIndexPath) -> Bool {
    // Return NO if you do not want the specified item to be editable.
    return true
}

// Override to support editing the table view.
override func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) {
    if editingStyle == .Delete {
        // Delete the row from the data source
        tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .Fade)
    } else if editingStyle == .Insert {
        // Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view
    }    
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...