埋め込みビューコントローラへのIBoutletリンク
-
12-12-2019 - |
質問
私はいくつかのビューコントローラを持つことによって管理する複雑なiPadビューを持っています。私は以前(iOS6 / Xcode 4.5)これを行いました。これは、コード内のビューコントローラを割り当て、マスタービューへのリンクでさまざまなビューを接続しました。
私がやりたいことは、新しいコンテナビューを使ってストーリーボードファイルにビューコントローラを埋め込むことです。IBoutlet Linkをマスターコントローラに埋め込みビューコントローラへのリンクを作成することができないようです。
これを行うことは可能ですか?またはコード内のタグまたは何かを介して組み込みコントローラを取得するか?
この質問は、コンテナビューの使用に関する特に
解決
「組み込みコントローラの取得」によってどういう意味ですか。コントローラを使用したい場合は、IBのコントローラに与える識別子を使用して、UistoryboardメソッドInstantialiaiTiveViewControllerWithIdentifierを使用します。PerformSegueWithIdentifier:Sender:Method(View Controllerをインスタンス化したもの)を使用することもできます。Apple Docsの「アプリ内のビューコントローラを使用する」セクションをチェックする必要があります。また、子ビューコントローラがコンテナコントローラと同時にインスタンス化されているという事実を参照します。
編集後:別のビューコントローラにコンテナビューを埋め込むと、その埋め込みビューのコントローラはSelf.ChildViewControllers(配列になるでしょう、それが1つだけの場合は入手できます。lastObjectを使って。
他のヒント
いくつかの場合には、-prepareForSegue:sender:
を使用して組み込みコントローラをキャプチャすることです。
例えば、UINavigationController
に埋め込まれたCustomContainerViewController
がある場合は、埋め込みSegue embedContentStack
にストーリーボードに名前を付けることができ、を介してCustomContainerViewController
でキャプチャできます。
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
if ([segue.identifier isEqualToString:@"embedContentStack"]) {
// can't assign the view controller from an embed segue via the storyboard, so capture here
_contentStack = (UINavigationController *)segue.destinationViewController;
}
}
. これについての別のスレッドは次のとおりです。親IOSからのコンテナビューコントローラのアクセス/ a>
注意の注意
この質問に対する回答を使用する前に、埋め込まれたものが本当にビューコントローラになる必要があるかどうかを反映したいと思うかもしれません。
EG UICollectionViewController
サブクラスを埋め込む場合は、代わりにUICollectionView
サブクラスを埋め込むことができますか?あるいは、さらに良い、Simple ViewModelの後ろにUIView
を隠すUICollectionView
サブクラスを埋め込むことができますか?
コードベースでは現在動作しています.2つのビューコントローラを別のビューコントローラに埋め込む。どちらも普通の景色を望み、この厄介なコードなしで、より簡単にわかりやすいビューになります。
残念ながら、現在はコントローラを表示しています。これは現在プレーンビューにそれらを単純化する立場にありませんので、これはやらなければなりません。
背景
遊び心のあるGeek が提案されているようにprepare(for segue:, sender:)
で埋め込みセグューを拾うためのアプローチを使用しています。
私がこれを使用しているスイフトを見せたかったのは、かなりきちんとしているようです...
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
}
}
}
.
議論
Actionメソッドとして選択しました。
Segue Identifiersのenum
ケースを使用すると、コンパイラとツーリングがあなたの側面に入ったことを意味しますので、セカンド名が間違っています。
private enum
スコープ内のextension
内のSegue IDを維持すると、この場合、これらのセグウスは他のどこにも必要とされないために適切に思われます(たとえば、perform
edはできません)。
埋め込みビューコントローラに暗黙的に開かれたタイプを使用しています(私の場合はいつでも)欠けている場合は論理エラーです。
同様に、宛先ビューコントローラの種類を強制的にキャストすることもできています。繰り返しますが、これらのタイプが同じではない場合はロジックエラーです。