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
相关产品推荐
相关产品推荐

