在 Swift iOS 中执行 segue 时出错

error performing segue in Swift iOS

我最近一直在研究 swift segues,我很想在我最新的应用程序中加入一个,问题是我似乎无法让它们工作。到目前为止,我已经创建了另一个视图控制器 SecondViewController 并在我的 ViewController & SecondViewController 文件中这样引用:

ViewController.swift

import UIKit

class ViewController: UIViewController {

var secondViewController: SecondViewController!
var viewController: ViewController!

override func viewDidLoad() {
//lots more code here

SecondViewController.swift

import UIKit

class SecondViewController: UIViewController {

var secondViewController: SecondViewController!
var viewController: ViewController!

override func viewDidLoad() {

他们在情节提要视图中我已经 crtl+ 将一个 segue 从 viewController 拖到 secondViewController 并且一旦创建了使用右侧面板的 segue 标识符,segue 标识符是 GameOver 并且 segue 类型是 show.

现在我想在没有用户交互的情况下自动调用 segue,在最终的应用程序中,一旦用户通过 func 点击游戏,它将触发 segue 并显示一个新的 UIView,其中可以用其他几项。

我用来调用 segue 的代码是:

self.viewController.performSegueWithIdentifier("GameOver", sender: self)

我收到以下错误...

Thread 1:EXC_BAD_INSTRUCTION (code=EXC_1386_INVOP, subcode=0x0

我在输出字段中也有这个错误...

fatal error: unexpectedly found nil while unwrapping an Optional value (lldb)

我试过转场的名称和文件名,但我仍然遇到同样的错误,我确信我遗漏了一些基本的东西,所以希望有人能帮助我解决这个问题。

我创建了一个新项目并将其上传到 GitHub,如果有人能告诉我我遗漏了什么那就太好了,这是我的 GitHub =] 存储库 https://github.com/rich84ts/TestSingleView

谢谢。

您不能只输入一些实例属性并期望它们神奇地做某事:

class ViewController: UIViewController {

    var secondViewController: SecondViewController!
    var viewController: ViewController!

}

这些属性是 nil,向它们发送消息会使您的应用程序崩溃。你必须给他们 values.

在你的例子中,segue 源自这个视图控制器,所以你真正想说的是

self.performSegueWithIdentifier("GameOver", sender: self)

您犯的另一个大错误是您在 viewDidLoad 中说了所有这些。那太早了!你还不能做任何 segue-ing;您的视图甚至不在界面中!将您的代码移到 viewDidAppear: 中,它会真正起作用:

override func viewDidAppear(animated: Bool) {
    super.viewDidAppear(animated)
    self.performSegueWithIdentifier("GameOver", sender: self)
}

您的代码仍然愚蠢且无用,但至少您会看到一些事情发生并且您可以从那里继续开发。

我真正建议的是删除 viewDidLoad 实施并将其放入:

override func viewDidAppear(animated: Bool) {
    super.viewDidAppear(animated)
    func delay(delay:Double, closure:()->()) {
        dispatch_after(
            dispatch_time(
                DISPATCH_TIME_NOW,
                Int64(delay * Double(NSEC_PER_SEC))
            ),
            dispatch_get_main_queue(), closure)
    }
    delay(1) {
        self.performSegueWithIdentifier("GameOver", sender: self)
    }
}

这将使第一个视图控制器出现,等待一秒钟,然后调用第二个视图控制器。因此您将了解到一切都已正确连接,并可以继续做一些更实际的事情。

您可以通过按住 Control 键并单击 ViewController 对象并从手动转场拖动到目标视图控制器来从故事板创建手动转场。然后,您可以使用来自源控制器的指定标识符调用此 segue。您不需要引用目标视图控制器即可实现此目的。

要在您的视图控制器中引用情节提要中的任何内容,您需要像这样声明您的属性:

@IBOutlet var someProperty : UIView?

@IBOutlet 位使 属性 在故事板上可见,您可以按住控制键从它拖动到视图中的相应对象。但是,您不能使用视图控制器执行此操作。要在 segue 之前访问源视图控制器中的目标视图控制器,您需要覆盖 func prepareForSegue(_ segue: UIStoryboardSegue, sender sender: AnyObject?)。这允许您在实际转场之前从转场实例访问目标视图控制器(例如,如果您需要向其传递数据)。

首先你的 self.viewController 是一个 nil 对象,因为你只创建了变量而没有初始化它。您不能使用 nil 对象调用方法。其次,您已经从情节提要中创建了推送转场,但情节提要中没有导航控制器,因此 self.performSegueWithIdentifier("GameOver", sender: self) 也将不起作用。要使用 push segue,你应该在 UINavigationController 的堆栈中拥有当前 viewcontroller,所以首先在故事板中添加一个 UINavigationController 并创建初始视图控制器并将 ViewController 设置为导航控制器的根 ViewController然后调用 self.performSegueWithIdentifier("GameOver", sender: self)

然后代码就可以运行了。希望对您有所帮助。