Swift:在打开Optional时,执行Segue会发现nil

时间:2018-01-27 13:39:05

标签: swift crash segue optional

我知道还有其他一些关于类似错误的帖子,但是当用户试图传递一些数据时,会查看他​​们在准备segue方法时发生的那些错误。就我而言,我只是想从一个vc转到另一个vc。 IBOutlet与Storyboard相关联。我检查目的地vc准备segue并且它存在。在调用该方法之后发生崩溃。

这是我的代码:

import UIKit

class ViewController: UIViewController {

@IBOutlet weak var btnShowAccount: UIButton!
@IBOutlet weak var ivLaunch: UIImageView!

@IBOutlet weak var vButtonWrapper: UIView!
@IBOutlet weak var btnMissionLog: UIButton!
@IBOutlet weak var btnAccount: UIButton!
@IBOutlet weak var btnNotes: UIButton!
@IBOutlet weak var btnInfo: UIButton!
@IBOutlet weak var btnPrivacy: UIButton!
@IBOutlet weak var btnHelp: UIButton!

override func viewDidLoad() {
    super.viewDidLoad()

    //align button text to left
    btnAccount.contentHorizontalAlignment = .left
    btnMissionLog.contentHorizontalAlignment = .left
    btnNotes.contentHorizontalAlignment = .left

}

override func viewDidAppear(_ animated: Bool) {

    self.ivLaunch.fadeOut(0.15)
    self.vButtonWrapper.fadeIn()
}

@IBAction func showAccount(_ sender: Any) {
    self.performSegue(withIdentifier: "toAccountFromRoot", sender: self)
}

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    print(segue.destination)
}

错误消息未指向编译器尝试解包的对象:

Thread 1: Fatal error: Unexpectedly found nil while unwrapping an Optional value

XCode不太有用,因为它在第一行代码中的viewDidLoad中显示错误,这显然已经发生了。 (如果我注释掉所有viewDidLoad代码,它会在viewDidAppear中显示错误。)

我在调试导航器中看到了这一点:

; function signature specialization <preserving fragile attribute, Arg[1] = [Closure Propagated : reabstraction thunk helper from @callee_owned (@unowned Swift.UnsafeBufferPointer<Swift.UInt8>) -> () to @callee_owned (@unowned Swift.UnsafeBufferPointer<Swift.UInt8>) -> (@out ()), Argument Types : [@callee_owned (@unowned Swift.UnsafeBufferPointer<Swift.UInt8>) -> ()]> of generic specialization <preserving fragile attribute, ()> of Swift.StaticString.withUTF8Buffer<A>((Swift.UnsafeBufferPointer<Swift.UInt8>) -> A) -> A

enter image description here

任何帮助都会受到赞赏,我有点困惑于此。

1 个答案:

答案 0 :(得分:0)

您的堆栈抓取强烈建议您的destinationVC的类型100 * Bk与您的第一个VC使用的类相同。

您可以通过添加:

来验证这一点
Y

到您的ViewController方法。如果它打印print(type(of: segue.destination)) ,那么这就是你的问题。

在这种情况下,prepare(for:sender:)中的崩溃是在destinationVC加载时。因为它设置为ViewController而不是viewDidLoad(这是您对空白VC的期望),所以插座未连接,因此您在尝试访问时会收到解包的nil消息{{1 }}。通过删除 Identity Inspector 中的来修复空白视图控制器的类。

一旦你确认这是有效的。为destinationVC创建一个新类(即ViewController的子类),并在 Identify Inspector 中分配该类。