因此,感谢这篇精彩的文章,我找到了一个似乎对我有用的答案。https://cocoacasts.com/managing-view-controllers-with-container-view-controllers/
基本上我所做的是
1) 从 MasterViewController Storyboard 中移除 ContainerViews 和 Segues。
2)在MasterViewController中为分段控件的每个VC添加一个惰性属性。它们是懒惰的,因此它们仅在您真正需要它们时才被初始化
lazy var viewController1: LibraryViewController = {
let viewController = UIStoryboard.libraryViewController // convenience property to create the VC from Storyboard
// do other set up if required.
return viewController
}()
lazy var viewController2: LibraryViewController = {
let viewController = UIStoryboard.libraryViewController // convenience property to create the VC from Storyboard
// do other set up if required.
return viewController
}()
3) 使用以下 2 种方法创建 UIViewController 的扩展。我将它们添加到纯粹用于代码组织的扩展中,因为它们可能会在其他 ViewController 上重用。
extension UIViewController {
func add(asChildViewController viewController: UIViewController) {
// Add Child View Controller
addChildViewController(viewController)
// Add Child View as Subview
view.addSubview(viewController.view)
// Configure Child View
viewController.view.frame = view.bounds
viewController.view.autoresizingMask = [.flexibleWidth, .flexibleHeight]
// Notify Child View Controller
viewController.didMove(toParentViewController: self)
}
func remove(asChildViewController viewController: UIViewController) {
// Notify Child View Controller
viewController.willMove(toParentViewController: nil)
// Remove Child View From Superview
viewController.view.removeFromSuperview()
// Notify Child View Controller
viewController.removeFromParentViewController()
}
}
4) 现在,在更改段时调用的分段控制方法中,我只需添加正确的 ViewController。好消息是删除/添加它们实际上并没有释放它们。
func didPressSegmentedControl() {
if segmentedControl.selectedSegmentIndex == 0 {
remove(asChildViewController: viewController2)
add(asChildViewController: viewController1)
} else {
remove(asChildViewController: viewController1)
add(asChildViewController: viewController2)
}
}
5) 确保在第 4 点调用该方法,ViewDidLoad
以便在第一次加载 VC 时添加正确的 VC。
func viewDidLoad() {
super.viewDidLoad()
didPressSegmentedControl()
}
这样,当我们删除一个 ChildViewController 并添加另一个时,它将始终是 subviews 数组中的顶部 VC,并且我得到了漂亮的标题折叠动画。
这种方法的另一个好处是,如果你从不去特定的段,那么特定的 VC 将永远不会被初始化,因为它们是惰性属性,这应该有助于提高效率。
希望这可以帮助尝试做同样事情的人。