質問

私はいくつかのビューコントローラを持つことによって管理する複雑な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;
    }
}
.

注意の注意

この質問に対する回答を使用する前に、埋め込まれたものが本当にビューコントローラになる必要があるかどうかを反映したいと思うかもしれません。

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を維持すると、この場合、これらのセグウスは他のどこにも必要とされないために適切に思われます(たとえば、performedはできません)。

埋め込みビューコントローラに暗黙的に開かれたタイプを使用しています(私の場合はいつでも)欠けている場合は論理エラーです。

同様に、宛先ビューコントローラの種類を強制的にキャストすることもできています。繰り返しますが、これらのタイプが同じではない場合はロジックエラーです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top