2017-10-04 8 views
0

夕方私はアウトレットに問題があります。iOS Swift:なしカスタムViewControllerのIBOutlets

viewController1はpageControlで制御ページのコンテナにそれらを提示し、ViewController2の複数のインスタンスを作ります。

問題は、ViewController2のビューコントローラアウトレットが常にnilであることです。

おそらく、ViewController2がコード経由でインスタンス化するためです。

どうすればこの問題を解決できますか?

ここで私はここで異なるViewController2

let page = OnboardPageViewController(onboard: onboard) 
      pages.append(page) 

がViewController2

//-------------------- 
    //MARK: - Outlets 
    //-------------------- 

    @IBOutlet var backgroundVideoView: BackgroundVideo! 
    @IBOutlet var backgroundUIImage: UIImageView! 
    @IBOutlet var titleLabel: UILabel! 
    @IBOutlet var descriptionLabel: UILabel! 

    //-------------------- 
    //MARK: - Properties 
    //-------------------- 

    let onboard: Onboard 

    //-------------------- 
    //MARK: - View's Methods 
    //-------------------- 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     print("loaded: \(onboard.title)") 

     //FIXME: - need to find a way to link the outlets even if the controller is called via code 
    } 

    override func viewWillAppear(_ animated: Bool) { 
     super.viewWillAppear(true) 
     print("presenting: \(onboard.title)") 
    } 

    init(onboard: Onboard) { 
     self.onboard = onboard 
     super.init(nibName: nil, bundle: nil) 
    } 

    required init?(coder aDecoder: NSCoder) { 
     fatalError("init(coder:) has not been implemented") 
    } 
+0

コントローラーのインスタンス化コードを含めてください。 – Alladinian

+0

@Alladinianはそれを今チェックしてください:) –

答えて

1

のための初期化コードであるあなたは、UIStoryboardオブジェクトを介してインスタンス化するために、このようなもの持って作成:

if let viewController = UIStoryboard.init(name: "YourStoryBoardName", bundle: nil).instantiateViewController(withIdentifier: "YourViewController") { 
    // do something with it 
} 

キャストすることができますそれを編集

as? CustomClassViewCotroller付き)アンラップと同時にでカスタムクラスへ:とき、あなたのコード内でより多くのオプションのアンラップがあるでしょう

class YourViewController: UIViewController { 

    static func instantiate(withViewModel vm: ViewModel) -> YourViewController? { 
     if let viewController = UIStoryboard.init(name: "YourStoryboard", bundle: nil).instantiateViewController(withIdentifier: "YourViewController") as? YourViewController { 
      viewController.viewModel = vm 

      return viewController 
     } 

     return nil 
    } 

    var viewModel: ViewModel? 

    // ... 

} 

ます。initのようなあなたのビューコントローラをインスタンス化する静的FUNC viewModel varを使用していますが、これはビューコントローラをプログラムで作成する正しい方法だと思います(変数を設定する必要がありますが、別の履歴です)。

幸運な仲間。

+0

ありがとうございますが、私はカスタムのinitを使用して、どうすればいいですか? –

+1

カスタムinitは使用しないでください。あなたのVCにプロパティを追加し、ストーリーボードを使ってインスタンス化した後にそれらを設定してください –

+0

Lou Francoは言ったように、ストーリーボードのインスタンス化後にView Controllerビューモデルを設定できます。私は通常、1つの呼び出しですべてのインスタンス化を行うすべてのView Controllerに静的メソッドを持っています。 –

1

アウトレットは、ストーリーボードファイルがロードされるまでnilになります。したがって、initの直後には、それらはゼロになります。アクセスする前にviewDidLoadが呼び出されるまで待つ必要があります。

initが必要な場合は、VCの設定を行うには、その情報を保持するために他の(非コンセント以外の)プロパティを追加する必要があります。あなたは、単にコンセントを起動してからアクセスすることはできません。

EDIT:あなたのコード(後で追加)で、あなたはXIBまたはストーリーボードを使用していません。しかし、アウトレットがあるので、私はあなたが実際にアウトレットを持っていると仮定しています。

カスタムinitを使用しないでください。ストーリーボードのインスタンス化を使用して初期化した後、プロパティを追加して設定します。

+0

私はそれを行う方法がわかりません、あなたは例を挙げることができますか? –

+1

ストーリーボードからインスタンス化する方法については、Joseの答えを参照してください。'if let'の中で、viewController.onboardを設定します。 –

関連する問題