it-swarm.com.ru

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

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

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

85
willi

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

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: для фиксации удаления.

275
willi

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

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

9
Marc Rochkind

Swift версия: 

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

    if(do something){

        return UITableViewCellEditingStyle.Delete or UITableViewCellEditingStyle.Insert

    }
    return UITableViewCellEditingStyle.None

}
4
kareem

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

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

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

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

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

2
Massimo Cafaro

На C #:

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

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

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

}

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

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

0
A.G

Вам необходимо реализовать функцию 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
}
0
Noodybrank