2016-12-11 14 views
0

Я пытаюсь создать segue, который работает вот так. Когда я коснусь первой ячейки в моем первом контроллере представления, я перейду ко второму контроллеру представления и отображу первую ячейку моего вида коллекции во втором контроллере представления. И когда я нажимаю вторую ячейку в контроллере первого представления, я перехожу к контроллеру второго представления и отображу вторую ячейку моего просмотра коллекции во втором контроллере представления. Я зашел так далеко, но это не сработало.Пытается создать segue между 2 ячейками коллекцииView из разных viewController

ПЕРВЫЙ ВЗГЛЯД CONTROLLER

var selectedIndexPath: NSIndexPath! 

    func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { 

     selectedIndexPath = indexPath as NSIndexPath 
     performSegue(withIdentifier: "mySegue", sender: self) 
     print (selectedIndexPath) 
    } 

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
     if segue.identifier == "mySegue" 
     { 
      let secondVC = segue.destination as! ViewController2 
      secondVC.initialDisplayCellIndexPath = selectedIndexPath 
     } 
    } 

ВТОРОЙ ВИД CONTROLLER

var initialDisplayCellIndexPath: NSIndexPath! 

override func viewWillAppear(_ animated: Bool) { 
     self.collectionView.layoutIfNeeded() 
     self.collectionView.scrollToItem(at: initialDisplayCellIndexPath as IndexPath, at: UICollectionViewScrollPosition.centeredHorizontally, animated: true) 
    } 

enter image description here

Когда я запускаю мое приложение он выходит из строя, как только я нажмите один из элементов. Это сообщение об ошибке:

<NSIndexPath: 0x600000227200> {length = 2, path = 0 - 1} 
fatal error: unexpectedly found nil while unwrapping an Optional value 

И ошибка в этой строке:

self.collectionView.scrollToItem(at: initialDisplayCellIndexPath as IndexPath, at: UICollectionViewScrollPosition.centeredHorizontally, animated: true) 

ответ

0

Подумайте о ! сила-UnWrap оператора в качестве оператора «аварии, если ноль» и не допустить его полностью, пока вы действительно, ДЕЙСТВИТЕЛЬНО понимать опцияs.

Объявляя переменную initialDisplayCellIndexPath как тип NSIndexPath!, или «неявно развернутый необязательный», вы гарантируете, что ваше приложение потерпит крах, если вы когда-либо ссылаетесь на эту переменную, и она равна нулю. Вместо этого вы должны использовать опцию «if let», необязательную цепочку или инструкцию охраны.

Если мы хотим помочь вам разобраться, почему вы терпите крах, вам необходимо предоставить контекст для этой линии. Какой метод он использует? Как выглядит стек вызовов в момент сбоя?

+0

И является начальнымDisplayCellIndexPath nil, когда вы рухнули? –

+0

Сделайте то, что я предлагаю. Преобразуйте initialDisplayCellIndexPath из типа 'NSIndexPath!' В 'NSIndexPath? '(От« неявно развернутого необязательного »до« нормального »необязательного. Затем добавьте опцию« if let », необязательную цепочку или инструкцию охраны, чтобы проверить значение nil, когда ваш метод' viewWillAppear' . называется –

+0

Ok я изменил его, как этот 'переопределение FUNC viewWillAppear (_ анимированный: Bool) { если initialDisplayCellIndexPath = ноль { self.collectionView.layoutIfNeeded() self.collectionView.scrollToItem (по адресу:! initialDisplayCellIndexPath как IndexPath, в : UICollectionViewScrollPosition.centeredHorizontally, animated: true) } else { } 'Теперь мое приложение не сработает. 2-й контроллер просмотра появляется, когда я нажимаю любую из ячеек, но collectionview на втором контроллере просмотра не прокручивает –

0

попробуйте это! Измените «котировки» на ваши коды.

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { 
if let segue = "PHOTOARRAY".cellForItem(at:indexPath) { 
performSegue(withIdentifier: "SEGUENAME", sender:segue) 
}} 

override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
if let cell = sender as? UICollectionViewCell { 
if let indexPath = self."FIRSTCOLLECTIONVIEWNAME".indexPath(for:cell) { 
if segue.identifier == "SEGUENAME" { 
let controller : "SECONDCOLLECTIONVIEWCLASSNAME" = segue.destination as! "SECONDCOLLECTIONVIEWCLASSNAME" 
controller."PHOTOARRAY" = self."PHOTOARRAY[indexPath.row] 
} 
} 
} 
}