UITableView отключить прокрутку для удаления, но все же удалить в режиме редактирования?

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

Когда вы закомментировали tableView: commitEditingStyle: forRowAtIndexPath:, я отключил удаление удаленных страниц и все еще имел кнопку "Удалить" в режиме редактирования, но что происходит, когда я нажимаю кнопку "Удалить". Что называется?

Ответ 1

Хорошо, это довольно легко. Это то, что я сделал, чтобы решить эту проблему:

Objective-C

- (UITableViewCellEditingStyle)tableView:(UITableView *)aTableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath
{
    // Detemine if it in editing mode
    if (self.tableView.editing)
    {
        return UITableViewCellEditingStyleDelete;
    }

    return UITableViewCellEditingStyleNone;
}

Swift 2

override func tableView(tableView: UITableView, editingStyleForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCellEditingStyle {
    if tableView.editing {
         return .Delete
    }

    return .None
}

Swift 3

override func tableView(_ tableView: UITableView, editingStyleForRowAt indexPath: IndexPath) -> UITableViewCellEditingStyle {
    if tableView.isEditing {
        return .delete
    }

    return .none
}

Вам по-прежнему нужно реализовать tableView:commitEditingStyle:forRowAtIndexPath: для фиксации удаления.

Ответ 2

Просто для того, чтобы все было ясно, салфетка для удаления не будет включена, если не реализовано tableView:commitEditingStyle:forRowAtIndexPath:.

Пока я находился в разработке, я не реализовал его, и, следовательно, удаление от удалений не было включено. Конечно, в готовом приложении это всегда будет реализовано, потому что в противном случае редактирование не будет.

Ответ 3

Быстрая версия:

override func tableView(tableView: UITableView, editingStyleForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCellEditingStyle {

    if(do something){

        return UITableViewCellEditingStyle.Delete or UITableViewCellEditingStyle.Insert

    }
    return UITableViewCellEditingStyle.None

}

Ответ 4

В принципе, вы включаете или запрещаете редактирование с помощью методов

- (void)setEditing:(BOOL)editing animated:(BOOL)animated

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

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

уведомляется о запросе удаления. Если вы реализуете этот метод, удалите его, чтобы автоматически удалить его. Если вы не реализуете этот метод, проведите по экрану, чтобы не удалить его, но вы не сможете удалить строку. Поэтому, насколько мне известно, вы не можете достичь того, о чем вы просили, если только не используете некоторые недокументированные частные API. Вероятно, именно так реализовано приложение Apple.

Ответ 5

На С#:

У меня была та же проблема, где это было необходимо, чтобы включить/отключить строки с опцией Удалить на свайпе. Несколько строк нужно было провести пальцем влево и удалить их, оставив их в другом цвете. Я добился с помощью этой логики.

[Export("tableView:canEditRowAtIndexPath:")]
public bool CanEditRow(UITableView tableView, NSIndexPath indexPath)
{

    if (deletedIndexes.Contains(indexPath.Row)){
        return false;
    }
    else{
        return true;
    }

}

Обратите внимание, что удаленные индексы представляют собой список индексов, которые удаляются из таблицы без дубликатов. Этот код проверяет, удалена ли строка, затем отключает свайп или наоборот.

Эквивалентной функцией делегата является Swift is canEditRowAtIndexPath.

Ответ 6

Вам необходимо реализовать функцию CanEditRowAt.

Вы можете вернуть.delete в функцию EditingStyleForRowAt, чтобы вы могли удалить ее в режиме редактирования.

func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool {
    if tableView.isEditing {
        return true
    }
    return false
}

func tableView(_ tableView: UITableView, editingStyleForRowAt indexPath: IndexPath) -> UITableViewCell.EditingStyle {
    return .delete
}

Ответ 7

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

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

    BOOL deleteBySwipe = NO;
    for (UIGestureRecognizer* g in tableView.gestureRecognizers) {
        if (g.state == UIGestureRecognizerStateEnded) {
            deleteBySwipe = YES;
            break;
        }
    }

    if (deleteBySwipe) {
        //this gesture may cause delete unintendedly
        return;
    }
    //do delete
}

}