我有这个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.
}
}
它在上面一行失败的原因是我试图强制解开一个 nil 可选,这someTitle
.
请告诉我在这种情况下设置someTitle
的方法。
您的第二个UIViewController
尚未加载,因此someTitle
IBOutlet将为零。您有两个选择:
-
简单的一个:你强制加载第二个
UIViewController
,例如:vc1.view
就足够了,然后你设置它(我不建议这样做) -
正确的选择是:你让第二个
UIViewController
负责在正确的时间设置自己的标题。如果你需要传递"My title"
,你可以简单地通过像configureVc(title: String)
这样的函数来传递它,或者通过公开一个像var title: String
这样的变量,等等,你会someTitle.text = title
第二个UIViewController
viewDidLoad
。
你需要它进入超类视图DidAppear吗,因为如果你把它放到超类viewDidLoad()中,它应该可以工作。我希望这对您和未来的观众有所帮助。