2016-09-13 17 views
6

Mam kontroler widoku podzielonego, a gdy użytkownik kliknie komórkę w widoku tabeli, aplikacja wyświetla kontroler widoku z widokiem kontenera i kontrolą segmentu, aby przełączać między dwoma kontrolerami widoku podrzędnego.Nie można zmienić kolejności kolekcji Zobacz komórki

Pierwszy kontroler widoku podrzędnego to kontroler widoku kolekcji. W każdej komórce widoku kolekcji znajduje się słowo.

Widok wygląda następująco:

view screen

dodam kontroler widoku dziecko programowo z tym kodem (od Detail View Controller, pojemnik subviews):

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

Tutaj to kod przełączania między widokami dwóch dzieci z kontrolką podzieloną na segmenty:

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

Aby móc zmienić kolejność komórek I wprowadziły tej metody dla mojego niestandardowej klasy 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() 
} 

Problem polega na tym, że po kliknięciu Tabela Zobacz komórek i aplikacja pokazuje pojemnik Widok z kolekcją View Controller osadzone, nie mogę zmienić kolejności komórek i aby móc to zrobić, muszę zmienić element potomny (z kontrolą segmentacji), a następnie wrócić do widoku kolekcji.

Jak mogę rozwiązać ten problem?

+0

Niestety jeśli zrobiłem kilka błędów z językiem, jestem włoski – ale00

+0

Co robisz na Tableview -didSelect? – Aks

+0

Nic nie robię na tableView-didSelect @Aks – ale00

Odpowiedz

0

chciałbym sprawdzić dwie rzeczy:

pierwsze nazywasz willMoveToParentViewController w swojej metodzie cycle(from: UIViewController, to: UIViewController), ale nie w viewDidLoad, spróbuj to zrobić. Z tego, co mogę przeczytać, powinieneś być w stanie zadzwonić pod numer cycle w swojej metodzie viewDidLoad, wywołanie metody na Nil -obiekcie (from) nic nie robi.

Po drugie sprawdź, czy twoje WordCollectionViewController collectionView delegate i dataSource są prawidłowo ustawione podczas pierwszego ładowania. Może to być trudne przy ładowaniu od StoryBoard, jeśli elementy nie zostały zainicjalizowane w czasie.

+0

Dziękuję, wprowadziłem te zmiany, ale nic się nie zmieniło – ale00

Powiązane problemy