web-dev-qa-db-ja.com

Swiftのコンテナ内のビューを取得するにはどうすればよいですか?

ストーリーボードに表示したコンテナビューがあります。別のシーンへの埋め込みセグエを表す素晴らしい小さな矢印があります。そのシーンの最上位オブジェクトは、カスタムUIViewControllerによって制御されます。カスタムクラスに実装されているメソッドを呼び出したい。コンテナにアクセスできる場合、内部の内容への参照を取得するにはどうすればよいですか?

39
Evan Conrad

prepareForSegueのメソッドであるUIViewControllerを使用して、現在のView ControllerからUIViewControllerへのアクセスを取得できます。これには、embedセグエが含まれます。

prepareForSegueに関するドキュメントから:

このメソッドのデフォルト実装は何もしません。関連するデータを新しいView Controllerに渡す必要がある場合、View Controllerはこのメソッドをオーバーライドします。セグエオブジェクトは遷移を記述し、セグエに関係する両方のView Controllerへの参照を含みます。

あなたの質問では、カスタムView Controllerでメソッドを呼び出す必要があると述べました。これを行う方法の例を次に示します。

1。埋め込みセグエに識別子を付けます。 Interface Builderでこれを行うには、セグエを選択し、Attributes Editorに移動して、Storyboard Embedセグエ

enter image description here

2。クラスを次のように作成します。

embeddedViewControllerへの参照が保持されるため、myMethodを後で呼び出すことができます。暗黙的にラップされていないオプションであると宣言されています。これは、nil以外の初期値を指定しても意味がないためです。

//  This is your custom view controller contained in `MainViewController`.
class CustomViewController: UIViewController {
    func myMethod() {}
}

class MainViewController: UIViewController {
    private var embeddedViewController: CustomViewController!

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if let vc = segue.destination as? CustomViewController,
                    segue.identifier == "EmbedSegue" {
            self.embeddedViewController = vc
        }
    }

    //  Now in other methods you can reference `embeddedViewController`.
    //  For example:
    override func viewDidAppear(animated: Bool) {
        self.embeddedViewController.myMethod()
    }
}

Identity Inspectorを使用して、IBのUIViewControllersのクラスを設定します。例えば:

enter image description here

そして今、すべてが動作するはずです。お役に立てば幸いです!

92
ABakerSmith

ABakerの答えは、親が子供について学ぶ素晴らしい方法を提供します。子のコードが親に到達するには、self.parent(またはObjCではparentViewController)を使用します。

11
Graham Perks