Как включить салфетки для удаления ячейки в TableView?


у меня есть UIViewController который реализует делегат TableViews и источник данных протоколов. Теперь я хочу добавить жест "swipe to delete" в ячейки.

как я должен пойти об этом.

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

по-прежнему функция салфетки не приходит .

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

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

13 73

13 ответов:

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

EDIT: вместе мы нашли проблему - tableView:editingStyleForRowAtIndexPath: вернулся UITableViewCellEditingStyleNone если таблица не была в режим редактирования.

как Дэн прокомментировал выше, вам нужно реализовать следующие методы делегата представления таблицы:

  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.");
}
// 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
    }   
}

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

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]
}

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

// Override to support conditional editing of the table view.
- (BOOL) tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath
{
    return(YES);
}

вывод Dunenkoff Кыр чат

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

}

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

это версия swift

// 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
    }    
}

Это было проблемой и для меня тоже...Я мог только получить swiping для удаления, чтобы работать один раз в 10 или около того попыток. Оказывается,gesture на телевизоре был заблокирован другим жестом в контроллере родительского вида. Телевизор был вложен в MMDrawerController (размах способный макет ящика).

просто настройка распознавателя жестов в контроллере ящика, чтобы не реагировать на близкие жесты в боковых ящиках, позволила swipe Удалить для работы в моем телевизоре.

вы также можете попробовать что-то подобное с gesture delegate:

-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer {
    return YES;
}

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

self.tableView.editing = NO;

если вы используете 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)")
        }
    }
    

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

- (nullable NSArray<UITableViewRowAction *> *)tableView:(UITableView *)tableView editActionsForRowAtIndexPath:(NSIndexPath *)indexPath
NSMutableArray *post= [NSMutableArray alloc]initWithObject:@"1",@"2",@"3",nil]; 


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

    NSUInteger row = [indexPath row];
    NSUInteger count = [posts count];

    if (row < count) {
        return UITableViewCellEditingStyleDelete;
    } else {
        return UITableViewCellEditingStyleNone;
    }
}

- (void)tableView:(UITableView *)tableView 
                    commitEditingStyle:(UITableViewCellEditingStyle)editingStyle
                    forRowAtIndexPath:(NSIndexPath *)indexPath {

    NSUInteger row = [indexPath row];
    NSUInteger count = [posts count];

    if (row < count) {

        [posts removeObjectAtIndex:row];
    }
}

вы можете увидеть все необходимые методы, создав класс UITableViewController (временный) в XCode 5, а затем скопировать метод, который вы хотите использовать. Те методы, которые вам нужны, будут прокомментированы с предварительно заполненными строками, которые вы хотите.