Tôi đã vật lộn với điều này trong một thời gian dài. Tôi đã có trường hợp mà tôi đã khác nhau, nhưng tương tự nhúng bảng điều khiển xem mà tôi muốn hiển thị tùy thuộc vào một tham số được thiết lập trong segue để xem bộ điều khiển. Những gì đã làm việc được đưa vào container nhúng với một IBOutlet trong bộ điều khiển khung nhìn. Vùng chứa có thể có các ràng buộc về kích thước được đặt trong IB. Tuy nhiên, không thực hiện bất kỳ phân đoạn nhúng nào trong IB. Sau đó, trong viewDidLoad, tôi lập trình thêm bộ điều khiển xem chính xác và ghim các cạnh của nó vào vùng chứa nhúng.
Trái tim của phương pháp này được nhìn thấy trong đoạn mã sau (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)
}
}
}
}
Trong ColorVC, người ta thấy các IBOutlet container và "màu sắc" tham số được thiết lập bởi bộ điều khiển xem bảng chính. RedTableVC, GreenTableVC và BlueTableVC đều được phân lớp từ ColorTableVC được phân loại phụ từ UITableViewController. Di sản chung cho phép tôi sử dụng một biến "colorTableVC" để trỏ đến bất kỳ bộ điều khiển tức thời nào. (Không hoàn toàn cần thiết). Nhưng điều này không tránh trùng lặp mã bên dưới để thêm chế độ xem trong chế độ thừa kế và ghim bộ điều khiển mới vào chế độ xem vùng chứa. Ở trên cùng, tôi đã tạo một tiện ích mở rộng trên UIView để ghim chế độ xem cho cạnh mẹ của nó.
Hình ảnh sau đây cho thấy cách dự án và đặc biệt là bộ điều khiển chế độ xem bên phải được thiết lập trong IB. Đối với ví dụ này, tôi đã tạo chiều cao của bộ điều khiển "nhúng" một nửa chiều cao của bộ điều khiển xem chính - vì vậy khi bạn xoay thiết bị, người ta có thể thấy rằng các ràng buộc được đặt trong IB thực sự được áp dụng.
Tôi nhận ra đây không phải là những gì bạn hỏi, nhưng như cách giải quyết khác, làm thế nào về việc có nhiều ContainerViews, chồng chéo và kích thước giống hệt nhau, mỗi segue tùy chỉnh riêng của họ. Sau đó, trong mã, thực hiện các segue chính xác bằng cách sử dụng '[self performSegueWithIdentifier:]' tùy thuộc vào con UIViewController bạn muốn hiển thị. Ít nhất, theo cách này, bạn giữ cho kích thước tự động của bạn, bạn giữ cho các kết nối của bạn trong IB và bạn giữ logic 'preparForSegue' của bạn. –