2017-07-18 34 views
6

Wiem, że istnieje możliwość zmiany kolejności pojedynczego elementu/komórki w czasie korzystania z nowych delegatów UITableViewDropDelegate i UITableViewDragDelegate, ale czy możliwe jest obsługiwanie obsługi wielu.Czy można używać iOS 11 Drag and Drop, aby zmienić kolejność wielu elementów/komórek jednocześnie w widoku UITableView?

Na przykład w tym zrzucie ja trzyma jeden przedmiot: Dragging a single item/cell

i upuszczanie komórkę stawia go na miejsce.

Jednak kiedy łapię wiele komórek otrzymuję żadnych oznak wejścia i komórki przyzwyczajenie Zmień kolejność: Multiple selection Drag and Drop with no entry sign

gdybym kilka pozycji z innej aplikacji działa dobrze, na przykład przeciąganie wielu wiadomości z iMessage: Multiple selection Drag and Drop from iMessage

Czy można to zrobić, zmieniając kolejność widoku tabeli tylko z lokalnymi elementami, aby umożliwić szybszą zmianę kolejności?

Oto mój kod:

UITableViewDragDelegate

extension DotViewController: UITableViewDragDelegate { 
    func tableView(_ tableView: UITableView, itemsForBeginning session: UIDragSession, at indexPath: IndexPath) -> [UIDragItem] { 
     return [getDragItem(forIndexPath: indexPath)] 
    } 

    func tableView(_ tableView: UITableView, itemsForAddingTo session: UIDragSession, at indexPath: IndexPath, point: CGPoint) -> [UIDragItem] { 
     return [getDragItem(forIndexPath: indexPath)] 
    } 

    func getDragItem(forIndexPath indexPath: IndexPath) -> UIDragItem { 
     // gets the item 
    } 
} 

UITableViewDropDelegate

extension DotViewController: UITableViewDropDelegate { 
    func tableView(_ tableView: UITableView, canHandle session: UIDropSession) -> Bool { 
     return true 
    } 

    func tableView(_ tableView: UITableView, dropSessionDidUpdate session: UIDropSession, withDestinationIndexPath destinationIndexPath: IndexPath?) -> UITableViewDropProposal { 
     return UITableViewDropProposal(operation: .move, intent: .insertAtDestinationIndexPath) 
    } 

    func tableView(_ tableView: UITableView, performDropWith coordinator: UITableViewDropCoordinator) { 
     // Handles Drop 
    } 
} 

viewDidLoad

override func viewDidLoad() { 
    super.viewDidLoad() 

    tableView.dataSource = self 
    tableView.delegate = self 
    tableView.dragDelegate = self 
    tableView.dropDelegate = self 

    tableView.dragInteractionEnabled = true 
} 

Odpowiedz

1

Za PO można dokonać ponownego porządkowania wielu wierszy, udostępniając odniesienia do wszystkich zaznaczonych komórek za pośrednictwem operatora przeciągania (np. tablica section.row), a następnie implementacja tableView: performDropWith: withCoordinator, aby zmienić ich kolejność. (Podejrzewam, że to wiesz)

Jeśli chcesz obsługiwać ponowne zamawianie, zwracając propozycję upuszczenia dla UITableViewDropProposal (operacja: .move, intent: .insertAtDestinationIndexPath), więc UIKit używa pre-iOS 11 tableView: moveRowAt: do funkcji to obsługuje tylko jeden wiersz.

Widok tabeli moveRowAt IndexPath do IndexPath. Możesz kontynuować implementację tego, jeśli chcesz, aby zmienić kolejność, używając Drag i Drop. Ponieważ widok tabeli będzie wywoływał to zamiast wywoływanie przez spadek wydajności z koordynatorem, jeśli zwróciłeś propozycję magicznego upuszczenia , a jeden wiersz zostanie faktycznie zmieniony.

Źródło: https://developer.apple.com/videos/play/wwdc2017/223/?time=1836

+0

Czy możesz wyjaśnić jak multi-row zmiana kolejności mogą być realizowane? Czy wdrażasz metody delegatów niższego poziomu zamiast "UITableViewDragDelegate"? –