UITableView desativar furto para excluir, mas ainda tem exclusão no modo de edição?

91

Eu quero algo semelhante ao aplicativo Alarme, onde você não pode deslizar para excluir a linha, mas ainda pode excluir a linha no modo Editar.

Quando comentado tableView: commitEditingStyle: forRowAtIndexPath :, desativei o furto para excluir e ainda tinha o botão Excluir no modo Editar, mas o que acontece quando pressiono o botão Excluir. O que é chamado?

eu vou
fonte

Respostas:

286

Ok, acabou sendo bem fácil. Isso é o que eu fiz para resolver isso:

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
}

Você ainda precisa implementar tableView:commitEditingStyle:forRowAtIndexPath:para confirmar a exclusão.

eu vou
fonte
bu, em seguida, deslize para excluir é ativado automaticamente, novamente. Ou não?
Massimo Cafaro
Não, deslizar para excluir não fica habilitado, se não estiver no modo de edição. É por isso que eu retorno UITableViewCellEditingStyleNone como padrão.
willi
3
Esqueci a menção de que você precisa se (editandoStyle == UITableViewCellEditingStyleDelete) em commitEditingStyle:
willi
Ok, com essa afirmação você tem a ação de deletar, mas tem uma visualidade diferente. Existe alguma chance de ter essa ação com a mesma visualidade da versão de furto?
Göktuğ Aral
@giuseppe Não importa. Ele não está errado ao se referir a si mesmo. Esse método delegado está se referindo ao mesmo tableView, então ele pode usar ou.
Stephen Paul
9

Só para deixar as coisas claras, deslizar para excluir não estará habilitado a menos que tableView:commitEditingStyle:forRowAtIndexPath:seja implementado.

Enquanto estava em desenvolvimento, não o implementei e, portanto, deslizar para excluir não foi ativado. Claro, em um aplicativo acabado, ele sempre seria implementado, porque senão não haveria edição.

Marc Rochkind
fonte
4

Versão Swift:

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

    if(do something){

        return UITableViewCellEditingStyle.Delete or UITableViewCellEditingStyle.Insert

    }
    return UITableViewCellEditingStyle.None

}
Kareem
fonte
3

Você precisa implementar a função CanEditRowAt.

Você pode retornar .delete na função EditingStyleForRowAt para que ainda possa excluir no modo de edição.

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
}
Noodybrank
fonte
2

Basicamente, você ativa ou desativa a edição usando os métodos

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

Se a edição estiver habilitada, o ícone de exclusão vermelho aparecerá e uma confirmação de exclusão será solicitada ao usuário. Se o usuário confirmar, o método delegado

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

é notificado da solicitação de exclusão. Se você implementar este método, deslizar para excluir é automaticamente ativado. Se você não implementar este método, deslizar para excluir não estará ativo; no entanto, você não poderá realmente excluir a linha. Portanto, até onde sei, você não pode conseguir o que pediu, a menos que use algumas APIs privadas não documentadas. Provavelmente é assim que o aplicativo da Apple é implementado.

Massimo Cafaro
fonte
1
Resolvi isso retornando o UITableViewCellEditingStyleDelete em tableView: editandoStyleForRowAtIndexPath: se estiver no modo de edição.
willi
0

Em C #:

Eu tive o mesmo problema onde era necessário habilitar / desabilitar linhas com a opção Excluir ao deslizar. Várias linhas precisavam ser deslizadas para a esquerda e excluídas, mantendo-as em outra cor. Consegui usando essa lógica.

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

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

}

Observe que deletedIndexes são uma lista de índices que são excluídos da tabela sem duplicatas. Este código verifica se uma linha foi excluída e, em seguida, desativa a passagem ou vice-versa.

A função de delegado equivalente é Swift is canEditRowAtIndexPath.

AG
fonte
0

Também me deparei com esse problema e resolvi com os códigos abaixo. espero que ajude você.

- (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
}

}

user4272677
fonte