设置

时间:2016-03-10 17:45:28

标签: ios xcode swift uiviewcontroller segue

基本上我的代码,Swift或编译器/ Xcode本身都有问题。我有2个ViewControllers,第二个(目标)有2个UIImage变量。第一个ViewController在prepareForSegue中设置这两个图像:

if let destVC = segue.destinationViewController as? SecondViewController {
    destVC.firstImage = firstImage
    destVC.secondImage = secondImage
}

每次我检查代码部分的内容时,都会设置firstImage和secondImage,并且永远不会为nil(它们都是在代码的那部分之前创建的,我甚至记录检查它们并且它们永远不会为零),但是在SecondViewController中的viewDidLoad方法中,应用程序崩溃导致firstImage被设置,但是secondImage是nil(我强制解包它)。我已经尝试过多次编译 - 每次都是零并且崩溃了。之后,我在segue代码中添加了print(“hello world”)行,删除了它,保存了文件,再次编译,app再也没有崩溃。

所以我的问题是 - 究竟发生了什么 - 通过代码判断,secondImage永远不应该是nil(因为secondImage永远不会是nil,也不是调试器中的nil或者当我创建断点时),所以为什么第二个图像在destVC成为零?

另外我需要提一下,我正在使用内置的Git,我不确定它是否可能以某种方式影响或破坏文件,因为我已经遇到过Xcode有时需要永远重新索引代码和自动完成停止的问题工作大约20-30秒,直到它这样做(我有一个带有i5的iMac Retina所以这真的不应该是一个问题)。

编辑:让我添加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设置正常,第二个不是?当我添加一行代码然后将其删除并再次编译所有内容时,为什么它开始正常工作。

我知道我可以检查secondImage是否为nil并且我可以执行可选的展开,但这里的重点是 - 为什么它根本没有任何理由设置为nil。

2 个答案:

答案 0 :(得分:1)

我能够通过将代码从viewDidLoad移动到viewWillAppear来解决这个问题。我的类变量(在呈现视图控制器中设置)在viewDidLoad中为nil,但是在viewWillAppear中实例化了{1}}奇怪的是,他们在viewDidLoad工作了一段时间。这似乎表明了竞争条件,但我不确定这是否有意义。

答案 1 :(得分:0)

您可以将图像传递给第二个VC的另一个图像属性,然后设置"传递"在SecondVC的viewDidLoad中的图像。 但是你无法将图像直接传递或设置为SecondVC的imageView.image,因为secondVC.imageView尚未在内存中分配。

您需要做的是在secondVC的.h中创建一个UIImage属性,并将图像传递给该Image属性。 在viewDidLoad

中设置图像