我最近一直在玩快速的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
谢谢。
答案 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 )
然后代码就可以了。希望这有帮助。