Swift中Modal VC无法正常显示求助:加载后无按钮与TextView
解决Modal ViewController显示空白的问题
看起来你遇到的是Modal VC初始化方式不对导致的界面空白问题,我来帮你分析原因并给出针对性的解决方案:
问题根源
你直接用let modalViewController = ClipboardViewController()初始化VC,但如果这个ClipboardViewController是在Storyboard里拖放设计界面的,这种初始化方式并不会加载Storyboard中你添加的按钮、TextView等控件,自然展示出来就是空白状态。
解决方案分两种情况:
情况1:ClipboardViewController是用Storyboard创建的
你需要像示例代码里跳转其他VC那样,通过Storyboard的标识来实例化VC,步骤如下:
- 打开你的Storyboard,选中
ClipboardViewController,在右侧Identity Inspector面板里设置Storyboard ID(比如设为"ClipboardVC") - 在
tableView(_:didSelectRowAt:)的对应分支里替换代码:
else if indexPath.row == 1 { guard let modalViewController = self.storyboard?.instantiateViewController(withIdentifier: "ClipboardVC") as? ClipboardViewController else { print("无法找到对应的ViewController,请检查Storyboard ID是否正确") return } modalViewController.modalPresentationStyle = .overCurrentContext present(modalViewController, animated: true, completion: nil) }
情况2:ClipboardViewController是纯代码创建的
如果是纯代码编写的VC,你需要手动在viewDidLoad里添加按钮、TextView等控件,并设置布局(frame或Auto Layout约束),同时别忘了给view设置背景色(不然overCurrentContext样式下view默认透明,看起来还是空白)。示例代码:
class ClipboardViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() // 设置半透明背景,避免完全透明看起来像空白 view.backgroundColor = UIColor.systemBackground.withAlphaComponent(0.9) // 添加TextView let textView = UITextView() textView.translatesAutoresizingMaskIntoConstraints = false textView.text = "这里是剪贴板内容" textView.layer.borderWidth = 1 textView.layer.borderColor = UIColor.lightGray.cgColor view.addSubview(textView) // 添加关闭按钮 let closeBtn = UIButton(type: .system) closeBtn.translatesAutoresizingMaskIntoConstraints = false closeBtn.setTitle("关闭", for: .normal) closeBtn.addTarget(self, action: #selector(dismissModal), for: .touchUpInside) view.addSubview(closeBtn) // 设置Auto Layout约束 NSLayoutConstraint.activate([ textView.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor, constant: 40), textView.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 20), textView.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -20), textView.heightAnchor.constraint(equalToConstant: 200), closeBtn.topAnchor.constraint(equalTo: textView.bottomAnchor, constant: 20), closeBtn.centerXAnchor.constraint(equalTo: view.centerXAnchor), closeBtn.widthAnchor.constraint(equalToConstant: 120), closeBtn.heightAnchor.constraint(equalToConstant: 44) ]) } @objc private func dismissModal() { dismiss(animated: true) } }
这种情况下,你原来的初始化方式就可以正常工作了。
额外提醒
你设置的modalPresentationStyle = .overCurrentContext会让Modal VC悬浮在当前界面之上,如果VC的view没有背景色或可见控件,会直接显示背后的界面,容易被误以为是空白,所以一定要确保view有背景色或者添加了可见的UI元素~
内容的提问来源于stack exchange,提问作者B2Fq
相关产品推荐
相关产品推荐

