UITableView отключить салфетки для удаления, но все еще есть удалить в режиме редактирования? - PullRequest
86 голосов
/ 09 июня 2009

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

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

Ответы [ 6 ]

279 голосов
/ 09 июня 2009

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

Objective-C

- (UITableViewCellEditingStyle)tableView:(UITableView *)aTableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath
{
    // Detemine if it's 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:, чтобы зафиксировать удаление.

9 голосов
/ 08 марта 2011

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

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

4 голосов
/ 25 июня 2015

Swift Версия:

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

    if(do something){

        return UITableViewCellEditingStyle.Delete or UITableViewCellEditingStyle.Insert

    }
    return UITableViewCellEditingStyle.None

}
2 голосов
/ 09 июня 2009

Как правило, вы включаете или отключаете редактирование, используя методы

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

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

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

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

0 голосов
/ 17 декабря 2018

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

Вы можете вернуть .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
}
0 голосов
/ 17 мая 2018

На C #:

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

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

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

}

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...