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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 11:46:02