在 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)
然后代码就可以运行了。希望对您有所帮助。
我最近一直在研究 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)
然后代码就可以运行了。希望对您有所帮助。