【发布时间】:2016-03-10 17:45:27
【问题描述】:
基本上我的代码、Swift 或编译器/Xcode 本身都有问题。我有 2 个 ViewController,第二个(目的地)有 2 个 UIImage 变量。第一个 ViewController 像这样在 prepareForSegue 中设置这两个图像:
if let destVC = segue.destinationViewController as? SecondViewController {
destVC.firstImage = firstImage
destVC.secondImage = secondImage
}
每次我检查该部分代码中发生的情况时,firstImage 和 secondImage 都已设置并且永远不会为 nil(它们都是在该部分代码之前创建的,我什至登录检查它并且它们永远不会为 nil),但是在 SecondViewController 的 viewDidLoad 方法中,应用程序崩溃导致 firstImage 已设置,但 secondImage 为 nil(我强制将其解包)。我已经尝试过多次编译它 - 每次它都是 nil 并且它崩溃了。之后,我在 segue 代码中添加了 print("hello world") 行,删除了它,保存了文件,再次编译,应用程序再也没有崩溃过。
所以我的问题是——到底发生了什么——从代码来看,secondImage 永远不应该是 nil(因为 secondImage 永远不会是 nil,在调试器中或当我创建断点时也不是 nil),那么为什么 secondImage在 destVC 中变成了 nil?
另外我需要提一下,我使用的是内置 Git,我不确定它是否会以某种方式影响或损坏文件,因为我已经遇到了 Xcode 有时需要永远重新索引代码和自动完成停止的问题工作大约 20-30 秒直到它完成(我有一个 iMac Retina 和 i5,所以这真的不应该成为问题)。
编辑:让我添加 SecondViewController 中的代码以使事情变得清晰:
...
class SecondViewController: UIViewController {
...
var firstImage: UIImage?
var secondImage: UIImage?
...
override func viewDidLoad() {
super.viewDidLoad()
self.loadMainImage(self.firstImage!)
self.loadSecondaryImage(self.secondImage!) // secondImage was nil all the time here so it crashed at this point cause of force unwrap
...
}
...
}
如您所见,我正在正确设置所有内容,并且这些方法采用 UIImage(不是可选的 UIImage?)并对这些图像进行处理,但是 secondImage 始终为零。所以我的问题是 - 为什么 firstImage 设置正常,而 second 不是?以及为什么当我添加一行代码然后删除它并重新编译所有内容时它开始正常工作。
我知道我可以检查 secondImage 是否为 nil,并且我可以进行可选的展开,但这里的重点是 - 为什么它会毫无理由地设置为 nil。
【问题讨论】:
-
你能在第二个视图控制器视图中显示代码吗?
-
你如何初始化 secondImage 并在第二个视图控制器中使用它?
-
@TejaNandamuri 添加了来自 SecondViewController 的代码以使事情变得清晰。没有什么奇怪的事情发生,由于某种原因, secondImage 总是为零。添加一行代码,将其擦除,然后再次保存并编译,崩溃消失了,并且始终按预期设置了 secondImage。
标签: ios xcode swift uiviewcontroller segue