使用 Storyboard 拖拽控件添加跳轉事件時出現黑屏,而純代碼創建同樣 ViewController 則正常。本文解釋原因並給出正確做法。
@IBAction func changePassword(sender: UIButton) {
let vc = ChangePasswordViewController() // 錯誤:直接 init,未加載 Storyboard 場景
self.present(vc, animated: true, completion: nil)
}
ChangePasswordViewController() 僅調用初始化器,不會加載 Storyboard 中設計的視圖層級、約束、Outlet 連接等,導致視圖為空(黑屏)。
@IBAction func changePassword(sender: UIButton) {
let storyboard = UIStoryboard(name: "Main", bundle: nil)
// "ChangePasswordVC" 是 Storyboard 中該控制器的 Storyboard ID
if let vc = storyboard.instantiateViewController(withIdentifier: "ChangePasswordVC") as? ChangePasswordViewController {
self.present(vc, animated: true, completion: nil)
}
}
Main.storyboardChangePasswordVC若按鈕在 Storyboard 中,可直接拖拽 Present Modally Segue 到目標 VC,無需寫代碼;傳值時覆寫 prepare(for:sender:)。
Storyboard 設計的控制器必須通過 instantiateViewController(withIdentifier:) 創建,直接 init() 只會得到空殼。