Невозможно изменить порядок ячеек представления коллекции
У меня есть контроллер разделенного вида, и когда пользователь щелкает ячейку в виде таблицы, приложение показывает контроллер вида с видом контейнера и управления сегментом для переключения между двумя контроллерами дочернего вида.
первый контроллер дочернего представления является контроллером представления коллекции. В каждой ячейке представления коллекции есть слово.
вид выглядит так:
я добавляю контроллер дочернего вида программно с помощью этого кода (из контроллера подробного представления, контейнера подвидов):
override func viewDidLoad() {
    self.currentViewController = self.storyboard?.instantiateViewController(withIdentifier: "WordCollectionViewControllerID")
    (self.currentViewController as! WordCollectionViewController).text = self.text
    self.currentViewController?.view.translatesAutoresizingMaskIntoConstraints = false
    self.addChildViewController(self.currentViewController!)
    self.addSubview(subView: self.currentViewController!.view, toView: self.textContainerView)
    self.currentViewController?.view.layoutIfNeeded()
    self.currentViewController?.didMove(toParentViewController: self)
    super.viewDidLoad()
}
func addSubview(subView: UIView, toView parentView: UIView) {
    parentView.addSubview(subView)
    var viewBindingsDict = [String: AnyObject]()
    viewBindingsDict["subView"] = subView
    parentView.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "H:|[subView]|", options: [], metrics: nil, views: viewBindingsDict))
    parentView.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "V:|[subView]|", options: [], metrics: nil, views: viewBindingsDict))
}
вот код для переключения между двумя представлениями детей с сегментированным управления:
@IBAction func changeChildViewController(_ sender: UISegmentedControl) {
    if sender.selectedSegmentIndex == 0 {
        let newViewController = self.storyboard?.instantiateViewController(withIdentifier: "WordCollectionViewControllerID")
        (newViewController as! WordCollectionViewController).text = self.text
        newViewController!.view.translatesAutoresizingMaskIntoConstraints = false
        cycle(from: self.currentViewController!, to: newViewController!)
        self.currentViewController = newViewController
        print("Reorder")
    } else {
        let newViewController = self.storyboard?.instantiateViewController(withIdentifier: "NavigationControllerEditTextViewControllerID")
        (newViewController?.childViewControllers[0] as! EditTextViewController).text = self.text
        newViewController!.view.translatesAutoresizingMaskIntoConstraints = false
        cycle(from: self.currentViewController!, to: newViewController!)
        self.currentViewController = newViewController
        print("Edit")
    }
}
func cycle(from: UIViewController, to: UIViewController) {
    from.willMove(toParentViewController: nil)
    self.addChildViewController(to)
    self.addSubview(subView: to.view, toView: self.textContainerView)
    to.view.layoutIfNeeded()
    from.view.removeFromSuperview()
    from.removeFromParentViewController()
    to.didMove(toParentViewController: self)
}
чтобы иметь возможность изменить порядок ячеек, я реализовал этот метод для своего пользовательского класса CollectionViewController:
override func collectionView(_ collectionView: UICollectionView, moveItemAt sourceIndexPath: IndexPath, to destinationIndexPath: IndexPath) {
    // Swap values if sorce and destination
    let change = textArray[sourceIndexPath.row]
    textArray.remove(at: sourceIndexPath.row)
    textArray.insert(change, at: destinationIndexPath.row)
    // Save changes in Core Data
    text?.reordered_text = textArray.joined(separator: " ")
    (UIApplication.shared.delegate as! AppDelegate).saveContext()
    collectionView.reloadData()
}
проблема в том, что когда я нажимаю ячейку представления таблицы, и приложение показывает представление контейнера с контроллером представления коллекции встроенный, я не могу изменить порядок ячеек,и чтобы сделать это, я должен изменить дочерний элемент (с сегментированным элементом управления), а затем вернуться к представлению коллекции.
как я могу решить эту проблему?
2 ответов
попробуйте реализовать следующие методы:
func beginInteractiveMovementForItem(at: IndexPath) -> Bool
func updateInteractiveMovementTargetPosition(targetPosition: CGPoint)
func endInteractiveMovement()
func cancelInteractiveMovement()
вы можете следовать этому руководству:http://nshint.io/blog/2015/07/16/uicollectionviews-now-have-easy-reordering/
Я бы проверил две вещи:
сначала вы звоните willMoveToParentViewController в своем cycle(from: UIViewController, to: UIViewController) метод, но не в viewDidLoad, пытаться сделать это.
Из того, что я могу прочитать, вы должны быть в состоянии назвать cycle в своем viewDidLoad метод, вызывающий метод на Nil-объект (from) ничего не делает. 
во-вторых, проверьте, если ваша WordCollectionViewController collectionView delegate и dataSource установлены правильно, когда он загружается в первый раз. Это может быть сложно в разы при загрузке из StoryBoard если элементы  не инициализирован вовремя. 
 
            