注意事项
在继续使用这个问题的答案之前,您可能希望反映嵌入式事物是否真的需要成为视图控制器。
例如,如果您要嵌入 UICollectionViewController 子类,是否可以改为嵌入 UICollectionView 子类?或者,更好的是,您能否嵌入一个 UIView 子类,将 UICollectionView 隐藏在一个简单的 ViewModel 后面?
在我目前正在处理的代码库中,我将两个视图控制器嵌入到另一个视图控制器中。两者都可以很容易地成为普通视图,然后可以更容易地绑定到情节提要中,而无需这些杂乱的代码。
不幸的是,它们目前是视图控制器,我现在无法将它们简化为普通视图,所以必须这样做。
背景
我正在使用prepare(for segue:, sender:) 中的嵌入segue 的方法,正如Playful Geek 这里所建议的那样。
我想展示我为此使用的 swift,因为它看起来相当整洁......
class EditionLandingViewController: UIViewController {
fileprivate var titlesView: SectionTitlesViewController!
fileprivate var sectionsView: SectionsViewController!
}
//MARK:-
extension EditionLandingViewController {
private enum SegueId: String {
case embedTitles
case embedSections
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
super.prepare(for: segue, sender: sender)
guard
let segueRawId = segue.identifier,
let segueId = SegueId(rawValue: segueRawId)
else { return }
switch segueId {
case .embedTitles:
self.titlesView = segue.destination as! SectionTitlesViewController
case .embedSections:
self.sectionsView = segue.destination as! SectionsViewController
}
}
}
讨论
我选择name segues as action methods。
对 segue 标识符使用 enum case 意味着您拥有编译器和工具,因此更难弄错 segue 名称。
在这种情况下,将 segue id 保存在 extension 范围内的 private enum 中似乎是合适的,因为其他任何地方都不需要这些 segue(例如,它们不能是 performed)。
我正在为嵌入式视图控制器使用隐式展开的类型,因为(在我的情况下)如果它们丢失,这是一个逻辑错误。
同样,我也很乐意强制转换目标视图控制器类型。同样,如果这些类型不相同,那将是一个逻辑错误。