Не удается изменить порядок ячеек представления коллекции

У меня есть контроллер разделенного представления, и когда пользователь щелкает ячейку в табличном представлении, приложение показывает контроллер представления с представлением контейнера и элементом управления сегментом для переключения между двумя дочерними контроллерами представления.

Первый дочерний контроллер представления — это контроллер представления коллекции. В каждой ячейке представления коллекции есть слово.

Вид выглядит следующим образом:

просмотр экрана

Я программно добавляю контроллер дочернего представления с помощью этого кода (из контроллера подробного представления, контейнера подпредставлений):

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

Проблема в том, что когда я нажимаю ячейку представления таблицы, и приложение показывает представление контейнера со встроенным контроллером представления коллекции, я не могу изменить порядок ячеек, и для этого я должен изменить дочерний элемент (с сегментированным Control), а затем вернитесь к просмотру коллекции.

Как я могу решить эту проблему?


person alessionossa    schedule 13.09.2016    source источник
comment
Извините, если я допустил некоторые ошибки с языком, я итальянец   -  person alessionossa    schedule 13.09.2016
comment
Что вы делаете на своем tableView-didSelect?   -  person Aks    schedule 13.09.2016
comment
Я ничего не делаю с tableView-didSelect @Aks   -  person alessionossa    schedule 13.09.2016
comment
В своем вопросе вы сказали, что при выборе ячейки таблицы вы показываете представление коллекции. Как ты это делаешь? и как вы вызываете перезагрузку ячейки?   -  person Aks    schedule 13.09.2016
comment
Я отредактировал, чтобы объяснить лучше. Я использую Storyboard Segue, чтобы открыть представление контейнера @Aks   -  person alessionossa    schedule 13.09.2016
comment
Можете ли вы вставить код того, что происходит, когда вы переключаетесь с помощью сегментированного управления   -  person vj9    schedule 16.09.2016


Ответы (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/

person Community    schedule 16.09.2016

Я бы проверил две вещи:

Во-первых, вы вызываете willMoveToParentViewController в своем методе cycle(from: UIViewController, to: UIViewController), но не в viewDidLoad, попробуйте сделать это. Из того, что я могу прочитать, вы должны иметь возможность вызывать cycle в своем методе viewDidLoad, вызов метода для Nil-объекта (from) ничего не делает.

Во-вторых, проверьте, правильно ли установлены ваши WordCollectionViewController collectionView delegate и dataSource при первой загрузке. Иногда это может быть сложно при загрузке из StoryBoard, если элементы не инициализированы вовремя.

person Aerows    schedule 16.09.2016
comment
Спасибо, я внес эти изменения, но ничего не изменилось - person alessionossa; 16.09.2016