Добавьте дополнительные кнопки в салфетки UITableView

В настоящее время я использую NSFetchedResultsController для обработки табличных представлений. Мне интересно, есть ли способ добавить дополнительные кнопки, такие как кнопка удаления в режиме салфетки?

Я подумываю о подклассе. Но не находите ничего полезного в справочных документах для моих проблем.

Спасибо заранее.

Ответ 1

Ваш заголовок вводит в заблуждение. NSFetchedResultsController не имеет никакого отношения к вашей конечной цели. Subclassing просто создаст больше работы, чем необходимо, что вы хотите изучить UITableViewRowAction. Это очень легко и схоже с новым UIAlertController, поэтому вы должны чувствовать себя очень комфортно с этим, если вы уже пробовали UIAlertController

Краткий обзор (прямо из документов) UITableViewRowAction:

Представляет делегат для действий, отображаемых в ответ на салфетки в указанной строке. (обязательный) Используйте этот метод, если вы хотите предоставить настраиваемые действия для одной из строк таблицы. Когда пользователь щелкает по горизонтали подряд, представление таблицы перемещает содержимое строки в сторону, чтобы выявить ваши действия. При нажатии одной из кнопок действия выполняется блок обработчика, сохраненный объектом действия. Если вы не реализуете этот метод, в представлении таблицы отображаются стандартные кнопки аксессуаров, когда пользователь просматривает строку.

Несколько заметок перед тем, как вы начнете:

  • Apple реализовала это в iOS8: так тщательно подумайте о своей цели развертывания. Если вы строго кодируете i0S8, это быстрая и простая альтернатива сторонним библиотекам или создание настраиваемого стиля редактирования UITableView. Если вы хотите сохранить совместимость для iOS7, ваши варианты ограничены этим форматом. ПРИМЕЧАНИЕ SIDE, это не приводит к фатальной ошибке в вашем коде, приложения iOS7 не будут разбиваться, однако пользовательские действия просто не отображаются.
  • Существует не так много настроек за пределами заголовка
  • Достоинства этого - то, что все обрабатывается с помощью блоков

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

- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath {
    //Obviously, if this returns no, the edit option won't even populate
    return YES;
}

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
    //Nothing gets called here if you invoke `tableView:editActionsForRowAtIndexPath:` according to Apple docs so just leave this method blank
}

Как минимум, это два метода, которые должны быть объявлены перед перемещением.

Чтобы на самом деле настроить кнопки действий в строке, следуйте общим рекомендациям следующим образом:

ШАГ 1 реализует метод tableView:editActionsForRowAtIndexPath:

-(NSArray *)tableView:(UITableView *)tableView editActionsForRowAtIndexPath:(NSIndexPath *)indexPath {
}

Как вы можете видеть, это метод экземпляра типа NSArray, поэтому вам нужно вернуть массив.

ШАГ 2 Добавить объекты действия для передачи в массиве. Пример:

{

UITableViewRowAction *delete = [UITableViewRowAction rowActionWithStyle:UITableViewRowActionStyleDefault title:@"Delete" handler:^(UITableViewRowAction *action, NSIndexPath *indexPath)
{
    // Delete something here
}];

UITableViewRowAction *more = [UITableViewRowAction rowActionWithStyle:UITableViewRowActionStyleDefault title:@" More " handler:^(UITableViewRowAction *action, NSIndexPath *indexPath)
{
    //Do whatever here : just as an example :
    [self presentUIAlertControllerActionSheet];
}];

}    

Вы можете изменить несколько свойств для этих действий в строке, но см. документы для полной настройки:

Чтобы настроить цвета фона действия строки, просто заготовьте его, как и большинство других действий внутри кнопок:

delete.backgroundColor = [UIColor redColor];
more.backgroundColor = [UIColor colorWithRed:0.188 green:0.514 blue:0.984 alpha:1]; //arbitrary color

ШАГ 3 Как уже упоминалось ранее, вам нужно вернуть массив в метод экземпляра, чтобы ваш полный код выглядел следующим образом:

-(NSArray *)tableView:(UITableView *)tableView editActionsForRowAtIndexPath:(NSIndexPath *)indexPath {

    UITableViewRowAction *delete = [UITableViewRowAction rowActionWithStyle:UITableViewRowActionStyleDefault title:@"Delete" handler:^(UITableViewRowAction *action, NSIndexPath *indexPath)
    {
        // Delete something here
    }];
    delete.backgroundColor = [UIColor redColor];

    UITableViewRowAction *more = [UITableViewRowAction rowActionWithStyle:UITableViewRowActionStyleDefault title:@" More " handler:^(UITableViewRowAction *action, NSIndexPath *indexPath)
    {
        //Just as an example :
        [self presentUIAlertControllerActionSheet];
    }];
    more.backgroundColor = [UIColor colorWithRed:0.188 green:0.514 blue:0.984 alpha:1];

    return @[delete, more]; //array with all the buttons you want. 1,2,3, etc...
}    

Дальнейшая ссылка: ССЫЛКА НА ДОКУМЕНТАЦИЮ


ДЛЯ СОЕДИНЕНИЯ SWIFT SYNTAX

override func tableView(tableView: UITableView, editActionsForRowAtIndexPath indexPath: NSIndexPath) -> [AnyObject]?  {

var delete = UITableViewRowAction(style: UITableViewRowActionStyle.Default, title: "Delete" , handler: { (action:UITableViewRowAction!, indexPath:NSIndexPath!) -> Void in
    //Do something
})
delete.backgroundColor = UIColor.redColor()

var more = UITableViewRowAction(style: UITableViewRowActionStyle.Default, title: "More" , handler: { (action:UITableViewRowAction!, indexPath:NSIndexPath!) -> Void in
    //Do something
})
more.backgroundColor = UIColor.blueColor()

    return [delete, more]
}

Ответ 2

Все пожелания @soulshined принятого ответа.

Вот версия Swift 3:

func tableView(_ tableView: UITableView, editActionsForRowAt indexPath: IndexPath) -> [UITableViewRowAction]? {
    let delete = UITableViewRowAction(style: .default, title: "Delete") { (action:UITableViewRowAction, indexPath:IndexPath) in
        print("delete at:\(indexPath)")
    }
    delete.backgroundColor = .red

    let more = UITableViewRowAction(style: .default, title: "More") { (action:UITableViewRowAction, indexPath:IndexPath) in
        print("more at:\(indexPath)")
    }
    more.backgroundColor = .orange

    return [delete, more]
}