UITableView wyłącz przesuwanie, aby usunąć, ale nadal masz usuwanie w trybie edycji?


91

Chcę czegoś podobnego do aplikacji Alarm, w której nie można przesuwać palcem po usunięciu wiersza, ale nadal można usunąć wiersz w trybie edycji.

Po skomentowaniu tableView: commitEditingStyle: forRowAtIndexPath :, wyłączyłem przesuwanie, aby usunąć i nadal miałem przycisk Usuń w trybie edycji, ale co się dzieje, gdy naciskam przycisk Usuń. Co się nazywa?

Odpowiedzi:


287

Ok, okazuje się to całkiem łatwe. Oto, co zrobiłem, aby to rozwiązać:

Cel C

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

    return UITableViewCellEditingStyleNone;
}

Szybki 2

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

    return .None
}

Szybki 3

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

    return .none
}

Nadal musisz zaimplementować, tableView:commitEditingStyle:forRowAtIndexPath:aby zatwierdzić usunięcie.


bu, a następnie przesuń, aby usunąć, jest ponownie automatycznie włączona. Albo nie?
Massimo Cafaro

Nie, przeciągnięcie, aby usunąć, nie jest włączone, jeśli nie jest w trybie edycji. Dlatego domyślnie zwracam UITableViewCellEditingStyleNone.
willi

3
Zapomniałem wspomnieć, że potrzebujesz if (editStyle == UITableViewCellEditingStyleDelete) w commitEditingStyle:
willi

Ok, z tym stwierdzeniem otrzymałeś akcję usuwania, ale ma ona inną wizualność. Czy jest jakaś szansa, aby ta akcja miała taką samą wizualność jak wersja machnięcia?
Göktuğ Aral,

@giuseppe To nie ma znaczenia. Nie myli się, odwołując się do siebie. Ta metoda delegata odwołuje się z powrotem do tego samego tableView, więc można użyć albo lub.
Stephen Paul

9

Aby wszystko było jasne, przeciągnij, aby usunąć, nie będzie włączone, chyba że tableView:commitEditingStyle:forRowAtIndexPath:zostanie zaimplementowane.

Podczas gdy byłem w fazie rozwoju, nie zaimplementowałem go, dlatego przeciągnij, aby usunąć, nie było włączone. Oczywiście w gotowej aplikacji zawsze byłby zaimplementowany, ponieważ w przeciwnym razie nie byłoby edycji.


4

Szybka wersja:

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

    if(do something){

        return UITableViewCellEditingStyle.Delete or UITableViewCellEditingStyle.Insert

    }
    return UITableViewCellEditingStyle.None

}

3

Musisz zaimplementować funkcję CanEditRowAt.

Możesz zwrócić .delete w funkcji EditingStyleForRowAt, dzięki czemu możesz nadal usuwać w trybie edycji.

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
}

2

Zasadniczo włączasz lub wyłączasz edycję za pomocą metod

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

Jeśli edycja jest włączona, pojawi się czerwona ikona usuwania, a użytkownik zażąda potwierdzenia usunięcia. Jeśli użytkownik potwierdzi, metoda delegata

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

otrzyma powiadomienie o żądaniu usunięcia. Jeśli zastosujesz tę metodę, przesuń palcem, aby usunąć, jest automatycznie aktywowany. Jeśli nie zaimplementujesz tej metody, przesuń palcem, aby usunąć, nie jest aktywne, jednak nie możesz w rzeczywistości usunąć wiersza. Dlatego, zgodnie z moją najlepszą wiedzą, nie możesz osiągnąć tego, o co prosiłeś, chyba że używasz nieudokumentowanych, prywatnych interfejsów API. Prawdopodobnie tak jest implementowana aplikacja Apple.


1
Rozwiązałem to, zwracając UITableViewCellEditingStyleDelete w tableView: editStyleForRowAtIndexPath: jeśli jest w trybie edycji.
willi

0

W C #:

Miałem ten sam problem, w którym trzeba było włączyć / wyłączyć wiersze za pomocą opcji Usuń po przesunięciu. Wiele wierszy trzeba było przesunąć w lewo i usunąć, zachowaj je w innym kolorze. Osiągnąłem, używając tej logiki.

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

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

}

Należy pamiętać, że usunięte indeksy to lista indeksów, które są usuwane z tabeli bez duplikatów. Ten kod sprawdza, czy wiersz został usunięty, a następnie wyłącza przesuwanie lub odwrotnie.

Równoważną funkcją delegata jest Swift canEditRowAtIndexPath.


0

Natknąłem się na ten problem i naprawiłem za pomocą poniższych kodów. mam nadzieję, że ci to pomoże.

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

}

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.