2016-03-04 64 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()中,它应该可以工作。我希望这可以帮助你和未来的观众。