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

Container View in Cocoa, Swap Contents at Runtime and Preserve Size

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

到目前为止一切顺利。

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

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

    containerView.addSubview(viewController.view)
}

这行得通,但是一旦我调整 window 的大小,子视图显然会保持其原始大小(我没有设置任何约束)。

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

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

...现在,window 无法调整大小! (它停留在子视图的初始大小)。

有什么方法可以做到这一点?

原来我需要做的就是在设置约束之前添加这一行:

    newView.translatesAutoresizingMaskIntoConstraints = false

我不清楚为什么我需要这个,因为我想添加的子视图属于从 storyboard 创建的视图控制器(那些是应该已经没有将自动调整掩码转换为约束...?);只有以编程方式创建的视图才需要此代码...