试图在不同viewController

时间:2016-12-11 21:46:59

标签: ios uicollectionview segue

我正在尝试创建一个像这样工作的segue。当我点击我的第一个视图控制器中的第一个单元格时,我将转到我的第二个视图控制器并在第二个视图控制器中显示我的集合视图的第一个单元格。当我在第一个视图控制器中点击第二个单元格时,我将转到第二个视图控制器并在第二个视图控制器中显示我的collectionview的第二个单元格。我走到这一步,但它不起作用。

第一视图控制器

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

第二视图控制器

    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)

2 个答案:

答案 0 :(得分:0)

! force-unwrap运算符视为&#34;如果为nil&#34;则崩溃操作员并完全避免它,直到你真的,真的了解选项。

通过将initialDisplayCellIndexPath变量声明为NSIndexPath!类型,或者#34;隐式解包可选&#34;,您可以保证如果您引用该变量并且它已经崩溃,您的应用就会崩溃。没有。而不是这样做你应该使用&#34;如果让&#34;可选链接或警卫声明。

如果我们要帮助您找出崩溃的原因,您需要提供该行的上下文。它是什么方法?在崩溃时调用堆栈是什么样的?

答案 1 :(得分:0)

试试这个!更改&#34;报价&#34;你的代码。

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