Uderzałem się w głowę nad tym, a Google nic nie pokazało. W końcu to opracowałem i pomyślałem, że napiszę to tutaj ze względu na następną osobę.
Masz UITableView
z wieloma sekcjami. Każda sekcja jest jednorodna, ale ogólnie tabela jest niejednorodna. Możesz więc chcieć zezwolić na zmianę kolejności wierszy w sekcji, ale nie w sekcjach. Może nawet chcesz, aby w ogóle można było ponownie zamówić tylko jedną sekcję (tak było w moim przypadku). Jeśli patrzysz, tak jak ja, na UITableViewDataSourceDelegate
nie znajdziesz powiadomienia, kiedy ma zamiar przenieść wiersz między sekcjami. Dostajesz jeden, gdy zaczyna przesuwać wiersz (co jest w porządku), a drugi, gdy został już przeniesiony, i masz szansę zsynchronizować się z wewnętrznymi elementami. Niepomocne.
Jak więc możesz zapobiec ponownemu zamawianiu między sekcjami?
Opublikuję to, co zrobiłem, jako osobną odpowiedź, pozostawiając otwartą dla kogoś innego, aby opublikował jeszcze lepszą odpowiedź!
źródło
Odpowiedzi:
Ta implementacja zapobiegnie ponownej kolejności poza oryginalną sekcją, taką jak odpowiedź Phila, ale także przyciągnie rekord do pierwszego lub ostatniego wiersza sekcji, w zależności od tego, gdzie poszło przeciągnięcie, zamiast od miejsca, w którym się zaczęło.
źródło
UIKit.UITableViewController.CustomizeMoveTarget
dla każdego, kto się zastanawia.Naprawdę dość proste.
UITableViewDelegate ma metodę:
Jest to wywoływane, gdy użytkownik znajduje się nad potencjalnym punktem zrzutu. Masz szansę powiedzieć: „nie! Nie upuszczaj tego tam! Rzuć to tutaj”. Możesz zwrócić inną ścieżkę indeksu do proponowanej.
Wszystko, co zrobiłem, to sprawdzenie, czy wskaźniki sekcji są zgodne. Jeśli im się to uda, wróć proponowaną ścieżką. jeśli nie, zwróć ścieżkę źródłową. To również ładnie zapobiega przesuwaniu się wierszy w innych sekcjach podczas przeciągania - a przeciągnięty wiersz wróci do pierwotnej pozycji, w której spróbujesz przenieść go do innej sekcji.
źródło
Szybka, szybka wersja odpowiedzi Jasona dla leniwych ludzi:
Swift 3, 4 i 5
Swift 1 i 2
źródło
Możesz zapobiec przesuwaniu się rzędów między sekcjami, używając poniższej metody. Po prostu nie pozwól na jakikolwiek ruch pomiędzy sekcjami. Możesz nawet kontrolować ruch określonego wiersza w sekcji. np. ostatni wiersz w sekcji.
Oto przykład:
źródło
Swift 3:
źródło
Niż @Jason Harwig, poniższy kod działa poprawnie.
źródło
Brak zmiany pozycji między sekcjami Swift3
źródło