UITableView editActionsForRowAtIndexPath перестает работать, если вы возвращаете пустой массив

У меня есть UITableView, для которого я добавил некоторые пользовательские кнопки слайда. Все они работают так, как ожидалось. Однако в моей таблице есть сценарий, в котором строка может находиться в состоянии, когда ни одна из кнопок слайда не является релевантной, и поэтому я возвращаю пустой массив действий, поэтому кнопки слайда не отображаются. К сожалению, когда это происходит, UITableView перестает вызывать мой editActionsForRowAtIndexPath, эффективно отключая кнопки слайда для всех строк в моей таблице... и кажется постоянным до перезапуска приложения.

Является ли это ожидаемым поведением?

func tableView(tableView: UITableView, editActionsForRowAtIndexPath indexPath: NSIndexPath) -> [AnyObject]?
{
    if mydata[indexPath.row].EditAvailable()
    {
        var editAction = UITableViewRowAction(style: .Default, title: "Edit", handler: editHandler)
        return [editAction]
    }
    else
    { 
        return []
    }
}

Ответ 1

Как я решил эту проблему, было реализовать функцию,

func tableView(tableView: UITableView, canEditRowAtIndexPath indexPath: NSIndexPath) -> Bool

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

Таким образом, код будет выглядеть примерно так.

func tableView(tableView: UITableView, canEditRowAtIndexPath indexPath: NSIndexPath) -> Bool {
  return mydata[indexPath.row].EditAvailable()
}

func tableView(tableView: UITableView, editActionsForRowAtIndexPath indexPath: NSIndexPath) -> [AnyObject]?
{
  var editAction = UITableViewRowAction(style: .Default, title: "Edit", handler: editHandler)
  return [editAction]
}

Теперь EditActionsForRowAtIndexPath вызывается только для тех, которые вы указали, редактируемыми.

Ответ 2

Попробуйте использовать tableView:editingStyleForRowAtIndexPath:.
Вы можете управлять включением/выключением самого слайда.

- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath {
    if (/* mydata[indexPath.row].EditAvailable() */) {
        return UITableViewCellEditingStyleDelete;
    } else {
        return UITableViewCellEditingStyleNone;
    }
}

(я тестировал в objective-c)

Ответ 3

Избегайте пропускать пустые массивы при -

tableView editActionsForRowAtIndexPath

Лучше выполнить проверку состояния -

tableView canEditRowAtIndexPath

Отформатируйте свой код следующим образом:

func tableView(tableView: UITableView, canEditRowAtIndexPath indexPath: NSIndexPath) -> Bool {
        if mydata[indexPath.row].EditAvailable()  {
            return true
        }
        return false
    }

func tableView(tableView: UITableView, editActionsForRowAtIndexPath indexPath: NSIndexPath) -> [AnyObject]?
    {
        var editAction = UITableViewRowAction(style: .Default, title: "Edit", handler: editHandler)
        return [editAction]
    }

Ответ 4

Во-первых, editActionsForRowAtIndexPath должен возвращать нуль, а не [], когда нет действий.

func tableView(tableView: UITableView, editActionsForRowAtIndexPath indexPath: NSIndexPath) -> [AnyObject]?
{
    if mydata[indexPath.row].EditAvailable()
    {
        var editAction = UITableViewRowAction(style: .Default, title: "Edit", handler: editHandler)
        return [editAction]
    }
    else
    { 
        return nil
    }
}

Во-вторых, вы должны реализовать editStyleForRowAtIndexPath, чтобы отключить действие "Удалить" по умолчанию для других строк.

func tableView(tableView: UITableView, editingStyleForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCellEditingStyle {
    if mydata[indexPath.row].EditAvailable() {
        return UITableViewCellEditingStyle.Delete
    }
    return UITableViewCellEditingStyle.None
}

Спасибо luciano за пустой кончик наконечника/ноль

Ответ 5

В iOS9.3 "canEditRowAtIndexPath" не работает!!!

- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath;

Итак, для меня работает следующий код. Необходимо реализовать только два метода.

-(NSArray *)tableView:(UITableView *)tableView editActionsForRowAtIndexPath:(NSIndexPath *)indexPath {
    if(//not editable){
        return nil;
    }
    return @[//your actions];
}

- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath{
    if(//not editable){
        return UITableViewCellEditingStyleNone;
    }
    return UITableViewCellEditingStyleDelete;
}

Ответ 6

Вы не должны возвращать пустой массив для действий в editActionsForRowAtIndexPath. Если вы хотите сделать строку недоступной для редактирования... return false на canEditRowAtIndexPath. Как только вы вернете пустой массив, все строки перестанут показывать кнопки салфетки. Его странное поведение, я не знаю, является ли его сбой или как предполагалось.

Ответ 7

Я реализовал подобное выборочное использование действий для некоторого tableCell с использованием ob-c (не тестировалось в swift) некоторое время назад, но поставил селективность в handleSwipe, ниже у меня есть действие для всех, кроме последнего:

- (void)handleSwipeLeft:(UISwipeGestureRecognizer *)gestureRecognizer{
    CGPoint location = [gestureRecognizer locationInView:self.tableView];
    NSIndexPath *swipedIndexPath = [self.tableView indexPathForRowAtPoint:location];
    if(!(swipedIndexPath.row<[coreDataHelper getAllTimerLists].count) ){
        [self.tableView setEditing:!self.tableView.editing animated:YES];
    }
}

Помогает ли это вам или вам нужно несколько разных массивов действий, в отличие от этого, у которых есть только один массив и инактивирует/активирует его?