无法指定ViewController的Bool成员

时间:2018-01-24 21:26:09

标签: ios swift boolean viewcontroller

由于某种原因,这为segue崩溃做准备,因为newGridViewController是nil。有什么想法吗?

override func prepare(for segue: UIStoryboardSegue,sender: Any?) {
  if segue.identifier == "Grid" {
    if let newGridViewController = segue.destination as? GridViewController
      if savePhotoWithSlicer.isOn {
      newGridViewController?.savePhotoWithSlicer = true
      if (newGridViewController?.savePhotoWithSlicer)! { print("TRUE") }
    }
  }
}

3 个答案:

答案 0 :(得分:1)

我猜问题是let newGridController = segue.destination as? GridViewController

我的想法是你的GridViewController是零。由于您强制在此行if (newGridViewController?.savePhotoWithSlicer)! { print("TRUE") }中解包newGridViewController,因此代码崩溃。

向我们展示更多代码,为您提供详细说明。

答案 1 :(得分:0)

目标c和Swift很乐意让你“赋值”给nil,这可能就是你在做什么了。只是b / c你将“true”分配给nil,并不意味着你实际上做了任何事情(“true”只是被忽略了)。所以当你强行解开零时,你仍然会崩溃。

答案 2 :(得分:0)

你没有说出异常是什么,但我想这是“意外地发现没有...”,这是由第二行最后一行展开的力量造成的,

我怀疑根本原因是GridViewController失败的条件转发,所以newGridViewController实际上是零。由于除了最后一行之外的任何地方都使用条件展开,因此在此之前不会发生崩溃。

更好的结构是使用if let...条件下转:

if let newGridViewController = segue.destination as? GridViewController {
    newGridViewController.savePhotoWithSlicer = savePhotoWithSlicer.isOn
    if newGridViewController.savePhotoWithSlicer { 
        print("TRUE") 
    }
}

这可以防止崩溃,但它可能仍然不会打印“TRUE”,因为我强烈怀疑segue.destination不是GridViewController - 你需要检查你的故事板并确保你为你的场景提供合适的自定义类。

更新

由于您现在已经澄清了segue导致嵌入GridViewController的导航控制器,您可以使用它来获取所需的视图控制器:

override func prepare(for segue: UIStoryboardSegue,sender: Any?) {
    if segue.identifier == "Grid" {
        if let navController = segue.destination as? UINavigationController {
            if let newGridViewController = navController.viewControllers.first as? GridViewController {
                newGridViewController.savePhotoWithSlicer = savePhotoWithSlicer.isOn
                if newGridViewController.savePhotoWithSlicer { 
                    print("TRUE") 
                }
            }
        }
    }
}