【问题标题】:Destination's View Controller variable becoming nil after being setDestination 的 View Controller 变量在设置后变为 nil
【发布时间】: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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 如果您仔细查看我的问题,您会发现它是 Swift 代码,因此不需要 .h 文件,因为所有内容都在 1 个 .swift 文件中定义。是的,两个 UIImage 都在 SecondViewController 中声明——如果它们不是 Xcode 甚至不会让我编译该代码。
    • @saheb-roy 你结束了我对修复的无尽搜索。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-10
    • 2011-10-21
    • 2019-07-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多