使用 Segue 发送变量
Sending Variables with a Segue
我正在开发一个简单的 iOS Swift 应用程序。该应用程序有 2 个视图控制器和一个按钮,该按钮已被编程为继续连接到另一个视图控制器,如下所示:
@IBAction func pushMe(sender: AnyObject) {
self.performSegueWithIdentifier("changeIt", sender: nil)
}
上面的方法有效,但我希望能够从当前视图控制器中保存 2 个变量,并使它们可供我正在使用的视图控制器使用。所以我这样做了:
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!) {
if segue.identifier == "changeIt" {
var testVar1 = "Hello"
var testVar2 = "World"
}
}
在我正在继续的视图控制器中,我添加了:
var testVar1:String!
var testVar2:String!
该应用程序运行正常,但当我尝试访问 testVar1 或 testVar2 时,该应用程序崩溃了。我不确定为什么这没有按预期工作?
if segue.identifier == "changeIt" {
var testVar1 = "Hello"
var testVar2 = "World"
}
您在这里所做的只是创建新的、完全独立的局部变量,称为 testVar1
和 testVar2
。根据一些奇迹般的一厢情愿,它们与属于您正在继续访问的视图控制器的实例属性 testVar1
和 testVar2
不同。他们怎么可能?该代码甚至根本没有提到该视图控制器!如果要设置视图控制器的 属性,则需要与该视图控制器对话。
这样想。假设 Dog class 有一个 name
属性 而你想设置一个 Dog 实例的 name
。你是这样说的吗?
let d = Dog()
let name = "Fido"
没有!这会创建一个 name
,但它不是 狗的 名称。你需要这样说:
let d = Dog()
d.name = "Fido"
因此在您的代码中,您需要使用 segue 获取对目标视图控制器的引用并设置其属性。
因为变量没有初始化,你省略了目标视图控制器。使用下面的代码
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!) {
if segue.identifier == "changeIt" {
let dvc = segue.destinationViewController as! YourDestinationViewController
dvc.testVar1 = "Hello"
dvc.testVar2 = "World"
}
}
您可以在目标 ViewController
上创建变量来解决它
class OtherViewController : UIViewController {
var testVar1 : String = ""
var testVar2 : String = ""
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
var message = "\(self.testVar1) \(self.testVar2)"
print(message)
}
}
UIStoryboardSegue 有一个目的地ViewController属性。它是您想要到达的端点视图控制器的一个实例。那么现在你可以这样做了:
class SourceViewController : UIViewController {
//...
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
//Some code before
var destination = segue.destinationViewController as! OtherViewController
destination.testVar1 = "Hello"
destination.testVar2 = "World"
//Some code after
}
}
我正在开发一个简单的 iOS Swift 应用程序。该应用程序有 2 个视图控制器和一个按钮,该按钮已被编程为继续连接到另一个视图控制器,如下所示:
@IBAction func pushMe(sender: AnyObject) {
self.performSegueWithIdentifier("changeIt", sender: nil)
}
上面的方法有效,但我希望能够从当前视图控制器中保存 2 个变量,并使它们可供我正在使用的视图控制器使用。所以我这样做了:
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!) {
if segue.identifier == "changeIt" {
var testVar1 = "Hello"
var testVar2 = "World"
}
}
在我正在继续的视图控制器中,我添加了:
var testVar1:String!
var testVar2:String!
该应用程序运行正常,但当我尝试访问 testVar1 或 testVar2 时,该应用程序崩溃了。我不确定为什么这没有按预期工作?
if segue.identifier == "changeIt" {
var testVar1 = "Hello"
var testVar2 = "World"
}
您在这里所做的只是创建新的、完全独立的局部变量,称为 testVar1
和 testVar2
。根据一些奇迹般的一厢情愿,它们与属于您正在继续访问的视图控制器的实例属性 testVar1
和 testVar2
不同。他们怎么可能?该代码甚至根本没有提到该视图控制器!如果要设置视图控制器的 属性,则需要与该视图控制器对话。
这样想。假设 Dog class 有一个 name
属性 而你想设置一个 Dog 实例的 name
。你是这样说的吗?
let d = Dog()
let name = "Fido"
没有!这会创建一个 name
,但它不是 狗的 名称。你需要这样说:
let d = Dog()
d.name = "Fido"
因此在您的代码中,您需要使用 segue 获取对目标视图控制器的引用并设置其属性。
因为变量没有初始化,你省略了目标视图控制器。使用下面的代码
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!) {
if segue.identifier == "changeIt" {
let dvc = segue.destinationViewController as! YourDestinationViewController
dvc.testVar1 = "Hello"
dvc.testVar2 = "World"
}
}
您可以在目标 ViewController
上创建变量来解决它class OtherViewController : UIViewController {
var testVar1 : String = ""
var testVar2 : String = ""
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
var message = "\(self.testVar1) \(self.testVar2)"
print(message)
}
}
UIStoryboardSegue 有一个目的地ViewController属性。它是您想要到达的端点视图控制器的一个实例。那么现在你可以这样做了:
class SourceViewController : UIViewController {
//...
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
//Some code before
var destination = segue.destinationViewController as! OtherViewController
destination.testVar1 = "Hello"
destination.testVar2 = "World"
//Some code after
}
}