【问题标题】:Swift viewcontroller declaration returning nilSwift viewcontroller 声明返回 nil
【发布时间】: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


【解决方案1】:

您的 SaveNewItem() 方法可能返回 nil。 尝试这个: 保存新项目? = 保存新项目() println(saveNewItem?)

它返回 nil 吗?

【讨论】:

  • 将其视为连续语句,不会构建。
  • 所以你应该把 println 放在下一行。我还没有得到堆栈溢出布局,所以我没有把它放在下一行
  • 两个语句在不同的行,println 语句在另一行。它会产生“连续语句”错误
【解决方案2】:

找到了一种可以正常工作的方法。这些属性必须在创建类对象 saveNewItem 后调用。我忽略了 SaveLookItems 类具有属性:

var itemImage     : UIImage!
var imageOrigin   : NSString!
var itemType      : NSString! 

这需要具有 nil 以外的初始值,否则我会收到致命错误:意外发现 nil。

所以它现在适用于:

let saveNewItem = SaveNewItem()

print(saveNewItem)

if saveNewItem != nil {
    print("Contains a value!")
        saveNewItem.itemImage = image
        saveNewItem.itemType = "topItem"
        saveNewItem.imageOrigin = "Camera"
    _ = UIApplication.shared.keyWindow!.rootViewController
    self.present(saveNewItem, animated: true, completion: nil)
} else {
     print("Doesn’t contain a value.")

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-01
    • 1970-01-01
    相关资源
    最近更新 更多