2015-09-26 93 views
0

我正在使用一個簡單的iOS Swift應用程序。該應用程序有2個視圖控制器和已編程的按鈕,Segue公司其他視圖控制器,像這樣: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" 
    } 
} 

在,我segueing到我的視圖控制器補充說:

var testVar1:String! 
var testVar2:String! 

該應用的工作原理,但只要我試圖訪問testVar1或testVar2,應用程序崩潰。我不知道爲什麼這不按預期工作?

回答

3

因爲變量未初始化,所以省略了目標視圖控制器。使用下面

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!) { 
    if segue.identifier == "changeIt" { 
     let dvc = segue.destinationViewController as! YourDestinationViewController 
     dvc.testVar1 = "Hello" 
     dvc.testVar2 = "World" 
    } 
} 
+0

我現在明白了。感謝您的幫助! – user1822824

2
if segue.identifier == "changeIt" { 
    var testVar1 = "Hello" 
    var testVar2 = "World" 
} 

所有你這裏做的是製造新的,完全獨立的局部變量稱爲testVar1testVar2。通過一些奇蹟般的一廂情願,他們不屬於你所屬的視圖控制器的實例屬性testVar1testVar2。他們怎麼樣?該代碼甚至從來沒有提到視圖控制器!如果要設置視圖控制器的屬性,則需要與該視圖控制器交談

想想這樣。假設Dog類擁有name屬性,並且您想要設置Dog實例的name。你是這麼說的嗎?

let d = Dog() 
let name = "Fido" 

不!這創造了一個name,但它不是狗的名字。你需要這樣說:

let d = Dog() 
d.name = "Fido" 

因此,在你的代碼,你需要使用SEGUE得到一個參考到目的地視圖控制器並設置性能。

1

的代碼,你可以解決它的目的地創建變量視圖控制器

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 

    } 
}