You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 22:25:17