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?
ios
cocoa-touch
uitableview
uikit
willi
źródło
źródło
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.
źródło
Szybka wersja:
override func tableView(tableView: UITableView, editingStyleForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCellEditingStyle { if(do something){ return UITableViewCellEditingStyle.Delete or UITableViewCellEditingStyle.Insert } return UITableViewCellEditingStyle.None }
źródło
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 }
źródło
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.
źródło
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
.źródło
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 }
}
źródło