无法分配 ViewController 的 Bool 成员

Can't assign Bool member of 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") }
    }
  }
}

Objective c 和 Swift 会很乐意让你 "assign" 一个值为 nil 的值,这可能就是你正在做的。只是 b/c 您将 "true" 分配给 nil,并不意味着您实际上做了任何事情("true" 只是被忽略了)。所以当你强行打开 nil 时,你仍然会崩溃。

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

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

给我们一些更多的代码来给你详细的解释。

你没有说异常是什么,但我想它是 "unexpectedly found nil..." 由倒数第二行的强制展开引起的,

我怀疑根本原因是条件向下转换为 GridViewController 失败,所以 newGridViewController 实际上是零。由于您在除倒数第二行以外的所有地方都使用了条件解包,因此直到那时您都不会崩溃。

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

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

这将防止崩溃,但它可能仍然不会打印 "TRUE" 因为我强烈怀疑 segue.destination 不是 GridViewController - 你需要检查你的故事板和确保您的场景具有正确的自定义 class。

更新

由于您现在已经阐明 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") 
                }
            }
        }
    }
}