2016-03-04 67 views
1

設置一個UI元素我有這樣的UIViewController斯威夫特 - 從外部

import UIKit 

class UIViewController1: UIViewController { 

    @IBOutlet weak var someTitle: UILabel! 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     // Do any additional setup after loading the view. 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 
} 

,我試圖設置someTitle當我從另一個視圖控制器實例吧:

class ViewController: UIViewController { 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     // Do any additional setup after loading the view, typically from a nib. 
    } 

    override func viewDidAppear(animated: Bool) { 
     let stb = UIStoryboard(name: "Main", bundle: nil) 

     let vc1 = stb.instantiateViewControllerWithIdentifier("someSTBID") as! UIViewController1 
     vc1.someTitle.text = "My Title" // it fails here!!!!! 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    }  
} 

失敗的原因上面的行是,我試圖強制解包無可選,這是someTitle

請在這種情況下告訴我一種設置someTitle的方法。

回答

3

您的第二個UIViewController尚未加載,因此someTitle IBOutlet將爲零。你有兩個選擇:

  1. 最簡單的一個:你迫使第二UIViewController的負載,例如:vc1.view是夠了,然後你把它(我不推薦這種
  2. 正確的一個:你讓第二個UIViewController負責在正確的時間設置自己的標題。如果你需要通過"My title",你可以簡單的通過configureVc(title: String)這樣的函數來傳遞它,或者通過暴露像var title: String這樣的變量,所以viewDidLoad的第二個UIViewController就是someTitle.text = title
+0

謝謝佩雷斯。我認爲在你提到的方法2中,你的意思是'UIViewController1',對吧? – quanguyen

0

您是否需要它進入超類viewDidAppear,因爲如果將其放入超類viewDidLoad()中,它應該可以工作。我希望這可以幫助你和未來的觀衆。