Ответ 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]
}