Macos Cocoa中的容器视图,在运行时交换内容并保留大小

Macos Cocoa中的容器视图,在运行时交换内容并保留大小,macos,cocoa,nsview,Macos,Cocoa,Nsview,我的视图控制器有一个NSView,我将其用作容器视图。 我从库中拖动了“容器视图”,删除了segue和嵌入式视图控制器,向superview(视图控制器的主视图)添加了约束,并在视图控制器的代码中设置了容器视图的出口 到目前为止还不错 我希望将容器视图的内容与运行时确定的几个不同视图控制器的主视图交换。我成功地做到了这一点,代码如下: func swapContainerViewContents(with viewController: NSViewController) { self.

我的视图控制器有一个NSView,我将其用作容器视图。 我从库中拖动了“容器视图”,删除了segue和嵌入式视图控制器,向superview(视图控制器的主视图)添加了约束,并在视图控制器的代码中设置了容器视图的出口

到目前为止还不错

我希望将容器视图的内容与运行时确定的几个不同视图控制器的主视图交换。我成功地做到了这一点,代码如下:

func swapContainerViewContents(with viewController: NSViewController) {
    self.containerView.subviews.foreach({ subview in 
        subview.removeFromSuperview()
    })

    containerView.addSubview(viewController.view)
}
这是可行的,但只要我调整窗口的大小,子视图显然就会保持其原始大小(我没有设置任何约束)

如果相反,我添加了必要的约束:

let newView = viewController.view

containerView.addSubview(newView)

newView.leftAnchor.constraint(equalTo: containerView.leftAnchor).isActive = true
newView.rightAnchor.constraint(equalTo: containerView.rightAnchor).isActive = true
newView.topAnchor.constraint(equalTo: containerView.topAnchor).isActive = true
newView.bottomAnchor.constraint(equalTo: containerView.bottomAnchor).isActive = true
    newView.translatesAutoresizingMaskIntoConstraints = false
…现在,无法调整窗口的大小!(它卡在子视图的初始大小)


怎么做?

事实证明,我只需在设置约束之前添加这一行:

let newView = viewController.view

containerView.addSubview(newView)

newView.leftAnchor.constraint(equalTo: containerView.leftAnchor).isActive = true
newView.rightAnchor.constraint(equalTo: containerView.rightAnchor).isActive = true
newView.topAnchor.constraint(equalTo: containerView.topAnchor).isActive = true
newView.bottomAnchor.constraint(equalTo: containerView.bottomAnchor).isActive = true
    newView.translatesAutoresizingMaskIntoConstraints = false
我不清楚为什么我需要这个,因为我想添加的子视图属于从故事板创建的视图控制器(这些应该已经而不是将自动调整大小掩码转换为约束…?);只有以编程方式创建的视图才需要此代码