我正在开发一个简单的iOS Swift应用程序。该应用程序有2个视图控制器和一个按钮被编程为segue到另一个视图控制器,如下所示:
@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时,应用程序崩溃了。我不确定为什么这不能按预期工作?
答案 0 :(得分:3)
因为未初始化变量,所以省略了目标视图控制器。使用以下代码
Package Java
{
Ensure = 'Present'
Name = "Java 7 Update 72 (64-bit)"
Path = "${InstallerPath}\jdk-7u72-windows-x64.exe"
ProductId = '64A3A4F4-B792-11D6-A78A-00B0D0170720'
Arguments = "/s STATIC=1 WEB_JAVA=0"
}
答案 1 :(得分:2)
if segue.identifier == "changeIt" {
var testVar1 = "Hello"
var testVar2 = "World"
}
您在这里所做的只是创建一个名为testVar1
和testVar2
的新的完全独立的局部变量。通过一些神奇的一厢情愿的想法,它们与属于您正在观察的视图控制器的实例属性testVar1
和testVar2
相同。他们怎么样?该代码甚至从未提到过那个视图控制器!如果要设置视图控制器的属性,则需要将与该视图控制器进行对话。
这样想。假设Dog类具有name
属性,并且您想要设置Dog实例name
。你是这么说的吗?
let d = Dog()
let name = "Fido"
没有!这会创建一个name
,但它不是 dog的名称。你需要这样说:
let d = Dog()
d.name = "Fido"
因此,在您的代码中,您需要使用segue将引用到目标视图控制器并设置其属性。
答案 2 :(得分:1)
您可以解决它在目标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有一个 destinationViewController 属性。它是您想要到达的终点视图控制器的实例。然后你现在可以这样做:
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
}
}