SwiftUI View仅显示在contentView2,无法添加到contentView1求助
问题原因与解决方案
问题原因
一个UIView实例只能同时属于一个父视图。你在代码里先把vc.view添加到contentView1,紧接着又把它添加到contentView2,系统会自动将vc.view从contentView1的子视图列表中移除,最终只会在contentView2中显示这个SwiftUI视图。
解决方案
要让两个容器视图都显示TestView,需要为每个容器创建独立的UIHostingController实例,同时添加约束确保SwiftUI视图填满容器:
class ViewController: UIViewController { @IBOutlet var contentView1: UIView! @IBOutlet var contentView2: UIView! override func viewDidLoad() { super.viewDidLoad() // 给contentView1创建专属的HostingController let vc1 = UIHostingController(rootView: TestView()) vc1.view.translatesAutoresizingMaskIntoConstraints = false addChild(vc1) contentView1.addSubview(vc1.view) // 添加约束让视图完全填充容器 NSLayoutConstraint.activate([ vc1.view.topAnchor.constraint(equalTo: contentView1.topAnchor), vc1.view.leadingAnchor.constraint(equalTo: contentView1.leadingAnchor), vc1.view.trailingAnchor.constraint(equalTo: contentView1.trailingAnchor), vc1.view.bottomAnchor.constraint(equalTo: contentView1.bottomAnchor) ]) vc1.didMove(toParent: self) // 给contentView2创建专属的HostingController let vc2 = UIHostingController(rootView: TestView()) vc2.view.translatesAutoresizingMaskIntoConstraints = false addChild(vc2) contentView2.addSubview(vc2.view) // 添加约束让视图完全填充容器 NSLayoutConstraint.activate([ vc2.view.topAnchor.constraint(equalTo: contentView2.topAnchor), vc2.view.leadingAnchor.constraint(equalTo: contentView2.leadingAnchor), vc2.view.trailingAnchor.constraint(equalTo: contentView2.trailingAnchor), vc2.view.bottomAnchor.constraint(equalTo: contentView2.bottomAnchor) ]) vc2.didMove(toParent: self) } } struct TestView: View { var body: some View { Text("SwiftUI") .onAppear(perform: { print("OnAppear Called") }) } }
补充说明
- 每个
UIHostingController对应独立的SwiftUI视图实例,这样两个容器才能各自加载并显示内容。 - 必须设置
translatesAutoresizingMaskIntoConstraints = false并添加约束,否则SwiftUI视图可能无法正确适配容器尺寸。
内容的提问来源于stack exchange,提问作者Aaban Tariq Murtaza
相关产品推荐
相关产品推荐

