我也在這個問題上掙扎了很長時間。我曾經遇到過不同的情況,但我希望根據在視圖控制器中設置的參數來顯示類似的嵌入式表格視圖控制器。有用的是在視圖控制器中放入帶IBOutlet的嵌入式容器。容器可以在IB中設置大小約束。但是,不要在IB中嵌入任何內容。然後在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中分類的,它是從UITableViewController中分類出來的。共同的遺產讓我使用一個「colorTableVC」變量指向任何實例化的控制器。 (並非完全必要)。但是,這避免了重複下面的代碼,以在heirarchy中添加視圖並將新控制器固定到容器視圖。在頂部,我對UIView進行了擴展以將視圖固定到其父邊。
下圖顯示瞭如何在IB中設置項目,特別是右側的視圖控制器。在這個例子中,我將「嵌入式」控制器的高度設置爲主視圖控制器高度的一半 - 所以當您旋轉設備時,可以看到IB中設置的約束確實被應用。
![Embedded controller IB setup](https://i.stack.imgur.com/2ijl4.png)
我知道這不是你問什麼,但作爲其他的解決方法,如何有多個ContainerViews,重疊和相同的尺寸,每個都有自己的定製SEGUE。然後,在代碼中,根據你想顯示哪個子UIViewController,使用'[self performSegueWithIdentifier:]'執行正確的segue。至少,通過這種方式,您可以保持自動調整大小,將自己的連接保持在IB中,並保留「prepareForSegue」邏輯。 –