Swift切换视图控制器出现黑屏问题求助
Swift界面切换黑屏问题排查与解决
问题描述
切换到AddContactsController时出现黑屏,要求不将Presenter的声明移至viewDidLoad方法中。
相关代码
Controller代码
class AddContactsController: UIViewController { // MARK: - Constants private enum Constants { static let textField = "nameTextCell" static let datePicker = "datePicker" static let pickerView = "pickerView" static let textViewNotes = "textViewNotes" static let alertOk = "OK" static let alertQuestion = "It seems you made a mistake" static let navigationTitle = "Create" } // MARK: - AddPresenter var presenter: AddListPresenter? func instantiate() -> UIViewController { let vc = AddContactsController() let presenter = AddListPresenter() vc.presenter = presenter return vc } }
Presenter代码
class AddListPresenter { weak var view: AddListController? private var contact: Contact init(contact: Contact? = nil) { self.contact = contact ?? .init( name: "", surname: "", middleName: "", phone: "", email: "", date: "", sex: "", notes: "" ) } private var saveHieght: CGFloat = 0 }
解决方案
1. 修复视图控制器初始化逻辑(核心原因)
黑屏最直接的原因是视图未被正确加载:
- 如果
AddContactsController是通过Storyboard/XIB创建的,当前instantiate方法直接用AddContactsController()初始化会跳过Storyboard/XIB的视图加载流程,导致没有可显示的视图。需改为从Storyboard加载:
func instantiate() -> UIViewController { // 替换为你的Storyboard名称和ViewController的ID let storyboard = UIStoryboard(name: "Main", bundle: nil) guard let vc = storyboard.instantiateViewController(withIdentifier: "AddContactsController") as? AddContactsController else { fatalError("Failed to load AddContactsController from Storyboard") } let presenter = AddListPresenter() vc.presenter = presenter presenter.view = vc // 补全Presenter的视图引用 return vc }
- 如果是纯代码创建视图,必须在
AddContactsController中配置视图内容,至少设置背景色避免黑屏:
override func viewDidLoad() { super.viewDidLoad() view.backgroundColor = .white // 基础背景色配置 navigationItem.title = Constants.navigationTitle // 其他自定义视图初始化逻辑 }
2. 修正Presenter的视图引用类型
Presenter中weak var view: AddListController?的类型与实际视图控制器AddContactsController不匹配,会导致后续视图交互逻辑异常,需修正类型:
class AddListPresenter { // 改为正确的视图控制器类型 weak var view: AddContactsController? // 其余代码保持不变 }
3. 确保跳转逻辑在主线程执行
界面跳转必须在主线程执行,否则可能出现视图加载异常:
// 跳转时确保在主线程 DispatchQueue.main.async { self.navigationController?.pushViewController(addContactsVC, animated: true) }
总结
核心问题是视图控制器未正确加载视图,按上述步骤调整后即可解决黑屏问题,同时无需将Presenter的声明移至viewDidLoad中。
内容的提问来源于stack exchange,提问作者Vladislav
相关产品推荐
相关产品推荐

