我也为此苦苦挣扎了很长时间。我有一个不同但相似的嵌入式表格视图控制器,我想根据在视图控制器中设置的参数来显示它们。有效的是在视图控制器中放入带有 IBOutlet 的嵌入式容器。容器可以在 IB 中设置大小限制。但是,不要在 IB 中进行任何嵌入 segue。然后在 viewDidLoad 中,我以编程方式添加正确的视图控制器并将其边缘固定到嵌入容器。
这种方法的核心体现在以下代码(Swift 4)中:
extension UIView {
func pinToParent() {
self.translatesAutoresizingMaskIntoConstraints = false
let attributes: [NSLayoutAttribute] = [.top, .bottom, .right, .left]
NSLayoutConstraint.activate(attributes.map {
NSLayoutConstraint(item: self, attribute: $0, relatedBy: .equal, toItem: self.superview, attribute: $0, multiplier: 1, constant: 0)
})
}
}
class ColorVC: UIViewController {
@IBOutlet weak var tableContainer: UIView!
var color : rgb = .red
fileprivate var colorTableVC : ColorTableVC?
override func viewDidLoad() {
super.viewDidLoad()
switch color {
case .red:
colorTableVC = RedTableVC.init(style: .plain)
case .green:
colorTableVC = GreenTableVC.init(style: .plain)
case .blue:
colorTableVC = BlueTableVC.init(style: .plain)
}
if let vc = colorTableVC {
if (vc.view) != nil {
self.addChildViewController(vc)
tableContainer.addSubview(vc.view)
vc.view.pinToParent()
vc.didMove(toParentViewController: self)
}
}
}
}
在 ColorVC 中,可以看到容器 IBOutlet 和主表视图控制器设置的“颜色”参数。RedTableVC、GreenTableVC 和 BlueTableVC 都是 ColorTableVC 的子类,ColorTableVC 是 UITableViewController 的子类。共同的遗产让我使用一个“colorTableVC”变量来指向任何实例化的控制器。(并非完全必要)。但这确实避免了复制下面的代码以在层次结构中添加视图并将新控制器固定到容器视图。在顶部,我对 UIView 进行了扩展,以将视图固定到其父边缘。
下图显示了如何在 IB 中设置项目,尤其是右侧的视图控制器。对于这个例子,我将“嵌入式”控制器的高度设置为主视图控制器高度的一半——因此当您旋转设备时,可以看到确实应用了 IB 中设置的约束。