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

SwiftUI Sheet中加载UIKit视图为空的问题求助

解决SwiftUI Sheet中UIKit视图空白的问题

你的问题核心是**ViewController没有正确加载对应的界面文件**,直接通过ViewController()初始化时,系统不会自动关联你在Storyboard/XIB中创建的UI元素,导致所有IBOutlet控件都是nil,最终界面空白。

解决方案

情况1:使用XIB创建UI界面

如果你的ViewController是通过XIB文件(比如ViewController.xib)设计的,修改UIViewControllerRepresentable的初始化逻辑,明确指定XIB文件名:

struct GoogleSignInViewController: UIViewControllerRepresentable {
    func makeUIViewController(context: Context) -> ViewController {
        // 传入XIB文件名,确保和你的XIB文件名称一致
        return ViewController(nibName: "ViewController", bundle: nil)
    }
    
    func updateUIViewController(_ uiViewController: ViewController, context: Context) {}
}

情况2:使用Storyboard创建UI界面

如果你的ViewController是在Storyboard中创建的,先给ViewController设置Storyboard ID(比如GoogleSignInVC),然后通过Storyboard实例化:

struct GoogleSignInViewController: UIViewControllerRepresentable {
    func makeUIViewController(context: Context) -> ViewController {
        let storyboard = UIStoryboard(name: "Main", bundle: nil)
        // 替换成你设置的Storyboard ID
        return storyboard.instantiateViewController(withIdentifier: "GoogleSignInVC") as! ViewController
    }
    
    func updateUIViewController(_ uiViewController: ViewController, context: Context) {}
}

情况3:纯代码创建UI界面

如果不想依赖Storyboard/XIB,可以直接在ViewController中用代码创建并布局UI元素:

class ViewController: UIViewController {
    // 直接创建控件,不用IBOutlet
    let btnGoogleSignIn = UIButton(type: .system)
    let btnGoogleSignOut = UIButton(type: .system)
    let lblSignInStatus = UILabel()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        view.backgroundColor = .white
        
        // 配置标签
        lblSignInStatus.text = "Welcome To GoogleSignIn! To continue with GoogleSignIn please hit below button. "
        lblSignInStatus.numberOfLines = 0
        lblSignInStatus.translatesAutoresizingMaskIntoConstraints = false
        
        // 配置登录按钮
        btnGoogleSignIn.setTitle("Sign In with Google", for: .normal)
        btnGoogleSignIn.addTarget(self, action: #selector(btnGoogleSingInDidTap(_:)), for: .touchUpInside)
        btnGoogleSignIn.translatesAutoresizingMaskIntoConstraints = false
        
        // 配置登出按钮(默认隐藏)
        btnGoogleSignOut.setTitle("Sign Out", for: .normal)
        btnGoogleSignOut.addTarget(self, action: #selector(btnGoogleSignOutDidTap(_:)), for: .touchUpInside)
        btnGoogleSignOut.translatesAutoresizingMaskIntoConstraints = false
        btnGoogleSignOut.isHidden = true
        
        // 添加控件到视图
        view.addSubview(lblSignInStatus)
        view.addSubview(btnGoogleSignIn)
        view.addSubview(btnGoogleSignOut)
        
        // 设置自动布局约束
        NSLayoutConstraint.activate([
            lblSignInStatus.centerXAnchor.constraint(equalTo: view.centerXAnchor),
            lblSignInStatus.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor, constant: 20),
            lblSignInStatus.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 20),
            lblSignInStatus.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -20),
            
            btnGoogleSignIn.centerXAnchor.constraint(equalTo: view.centerXAnchor),
            btnGoogleSignIn.topAnchor.constraint(equalTo: lblSignInStatus.bottomAnchor, constant: 30),
            
            btnGoogleSignOut.centerXAnchor.constraint(equalTo: view.centerXAnchor),
            btnGoogleSignOut.topAnchor.constraint(equalTo: btnGoogleSignIn.bottomAnchor, constant: 20)
        ])
    }
    
    // 保持原有的逻辑,修改为@selector方法
    @objc func btnGoogleSingInDidTap(_ sender: Any) {
        GIDSignIn.sharedInstance.signIn(withPresenting: self) { signInResult, error in
            self.btnGoogleSignIn.isHidden = false
            self.btnGoogleSignOut.isHidden = true
            self.lblSignInStatus.text = "Welcome To GoogleSignIn! To continue with GoogleSignIn please hit below button. "
            guard error == nil else { return }

            guard let signInResult = signInResult else { return }
            let user = signInResult.user
            let fullName = user.profile?.name
                
            self.lblSignInStatus.text = "Hi \(fullName ?? "")"
            self.btnGoogleSignIn.isHidden = true
            self.btnGoogleSignOut.isHidden = false
        }
    }
    
    @objc func btnGoogleSignOutDidTap(_ sender: Any) {
        GIDSignIn.sharedInstance.signOut()
        self.lblSignInStatus.text = "Welcome To GoogleSignIn! To continue with GoogleSignIn please hit below button. "
        self.btnGoogleSignIn.isHidden = false
        self.btnGoogleSignOut.isHidden = true
    }
}

额外检查

  • 确保Storyboard/XIB中的控件已正确关联到ViewController的IBOutlet属性(右键控件拖动到代码中确认关联)。
  • 检查XIB/Storyboard的文件名和代码中传入的名称完全一致,大小写也要匹配。

内容的提问来源于stack exchange,提问作者Ethan James

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 21:14:51