注意事項
この質問への回答を使用する前に、埋め込まれているものが本当にビューコントローラである必要があるかどうかを検討することをお勧めします。
たとえば、UICollectionViewController
サブクラスを埋め込む場合、代わりにUICollectionView
サブクラスを埋め込むことができますか?または、さらに良いことに、単純なViewModelUIView
の背後に隠れているサブクラスを埋め込むことができますか?UICollectionView
現在取り組んでいるコードベースでは、2つのViewControllerを別のViewControllerに埋め込んでいます。どちらも、代わりにかなり簡単にプレーンビューにすることができ、この厄介なコードがなくても、ストーリーボードでより簡単にバインドできます。
残念ながら、それらは現在ビューコントローラであり、私は現在、それらを単純なビューに単純化する立場にないので、これを行う必要があります。
バックグラウンド
ここでPlayfulGeekprepare(for segue:, sender:)
が提案したように、埋め込みセグエをピックアップするアプローチを使用しています。
かなり整頓されているように見えるので、これに使用している迅速さを示したかったのですが…</ p>
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
}
}
}
討論
アクションメソッドとしてセグエに名前を付けることにしました。
セグエ識別子にケースを使用するenum
ということは、コンパイラーとツールが自分の側にあることを意味するため、セグエ名を間違えるのははるかに困難です。
この場合、セグエIDをスコープprivate enum
内に保持することは適切であると思われます。これは、これらのセグエが他の場所では必要ないためです(たとえば、編集extension
できません)。perform
埋め込まれたViewControllerに暗黙的にラップされていない型を使用しています。これは、(私の場合はとにかく)それらが欠落していると論理エラーになるためです。
同様に、宛先のViewControllerタイプを強制的にキャストすることもできます。繰り返しますが、これらのタイプが同じでない場合は論理エラーになります。