在Swift iOS

时间:2015-08-02 18:06:26

标签: ios iphone swift uiviewcontroller segue

我最近一直在玩快速的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标识符为{{1和segue类型是GameOver

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

我用来调用segue的代码是:

show

我收到以下错误...

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

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

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

我已经玩过了segues和文件名的名字,我仍然得到同样的错误,我确信我错过了一些基本的东西,所以希望有人可以帮我解决这个问题。

我已经创建了一个新项目并将其上传到GitHub,如果有人能告诉我我错过了什么会很棒,这里有一个指向我的GitHub存储库的链接https://github.com/rich84ts/TestSingleView

谢谢。

3 个答案:

答案 0 :(得分:3)

你不能只是抛出一些实例属性,并期望它们神奇地做一些事情:

class ViewController: UIViewController {

    var secondViewController: SecondViewController!
    var viewController: ViewController!

}

这些属性为nil,向其发送消息会导致您的应用崩溃。你必须给他们

在你的情况下,segue从这个视图控制器发出,所以你真正想说的是

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

你所犯的另一个重大错误就是你在viewDidLoad中说了这一切。那太早了!你还不能做任何划分;您的视图甚至不在界面中!将您的代码移到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)
    }
}

这将允许第一个视图控制器出现,等待一秒钟,然后召唤第二个视图控制器。因此,您将了解到所有内容都已正确连接,并可以继续做更实际的事情。

答案 1 :(得分:0)

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

要在视图控制器中引用故事板中的任何内容,您需要声明您的属性,如下所示:

@IBOutlet var someProperty:UIView?

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

答案 2 :(得分:0)

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

然后代码就可以了。希望这有帮助。