【发布时间】:2017-11-16 15:30:33
【问题描述】:
let saveNewItem = SaveNewItem()
print(saveNewItem)
if saveNewItem != nil {
print("Contains a value!")
_ = UIApplication.shared.keyWindow!.rootViewController
self.present(saveNewItem, animated: true, completion: nil)
} else {
print("Doesn’t contain a value.")
}
我收到臭名昭著的:致命错误:在展开可选值时意外发现 nil
在我的 saveNewItem 声明中,它是对不同视图控制器的调用:来自主视图控制器的 SaveNewItem 调用。
我很困惑为什么当 print 语句声明它在声明中有一个值存储时返回 nil。
我发现继续该过程的一个绕过方法是检查(cmd+单击)它在控制台中复制我的打印语句的 saveNewItem 常量,这给人的印象是它创建了一个对象。
我还尝试使用故事板链接视图控制器,如本问题所示: How to connect ViewController.swift to ViewController in Storyboard?
【问题讨论】:
-
您确定不是 keyWindow 具有
nil值吗?这是您强制展开的唯一值,所以如果不是那条线,我会感到惊讶。 -
SaveNewItem是一个 UIViewController,对吧?但它出现在 Xib 或 Storyboard 中吗?如果是,它可能有一些IBOultet。然后通过执行let saveNewItem = SaveNewItem(),您不会从 XIB 或情节提要中调用那个,因此所有这些元素都没有链接,您会发现自己遇到“在展开可选值时意外发现 nil”错误。 -
@DávidPásztor 是的,我确定这不是 keyWindow,而是以下行:self.present(saveNewItem, animated: true, completion: nil) 这会导致错误。
-
@Larme SaveNewItem 出现在情节提要中。如何确保故事板和视图控制器链接。
-
你应该使用
let saveNewItem = self.storyboard?.instantiateViewController(withIdentifier: "SaveNewItem")或者你的Viewcontroller的标识符。
标签: swift declaration viewcontroller forced-unwrapping optional-values