无法分配 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")
}
}
}
}
}
出于某种原因,这个为 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")
}
}
}
}
}