2017-08-07 11 views
0

私が持っている問題は、prepare(forSegue:)メソッドを呼び出すとき何が起こっているのかを理解することです。私はMainVeiwControllerからSecondViewControllerへのデータ転送の仕組みを得ます。特に値を渡している間に、私はSecondViewControllerの@IBOUTLETをMainViewControllerから初期化することはできませんが、var name:String?のような他のオプションのプロパティをSecondViewControllerのように初期化できます。それについて少しだけ興味がある。準備のLifeCycle(forSegue:....)

メインビューのクラス:2番目のビューのための

class MainViewController:UIViewController{ 
    .. 
    .. 
    .. 
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
    if let yourVC = segue.destinationViewController as? SecondViewController { 
     // this doesn't throw any error 
     yourVC.someData = self.someData 

     // this throws an error 
     yourVC.textLabel.text = self.someData 

     } 
    } 
} 

クラス:

class SecondViewController:UIViewController{ 

@IBOULET weak var textLabel:UILabel! 
var someData:String? 
.. 
.. 
.. 
} 
+0

何が起こってはならないと思われることが起こったのか、あるいはうまくいかなければならないと思っていることを説明してあなたの質問をしてください。 – dasblinkenlight

+0

コンセントにどのような価値を割り当てようとしていますか? –

+0

ビューがまだロードされていないため、IBOutletにアクセスすることはできません。'prepareForSegue'の送り先ビューコントローラで' loadViewIfNeeded'を呼び出してからIBOutletsにアクセスしてください。 – Paulw11

答えて

0

UIViewControllerインスタンスが作成されたときは、ビューは含まれません(イニシャライザで直接追加した場合を除きます)。

のViewControllerが初めて提示されようとしているとき、それはviewnilであるかどうか、それがゼロである場合、それはペン先やストーリーボードから自身をロードし、のViewControllerにビューを注入するチェックしviewDidLoad(_:)を呼び出ししたがって、prepare(forSegue:)システムでは、(segueの宛先タイプに基づいて)viewControllerをインスタンス化するだけで、それを設定する必要があります。data、それはビューではありません。ビューを制御したい場合は、loadViewIfNeeded()を呼び出してviewControllerにビューをロードさせます(これはアンチパターンです。これが唯一の選択肢であれば使用してください)。

通常、これはどのように行うのです:

あなたは外部から設定可能ないくつかの変数を定義します。 ex:var someString: String!これは、この値がnilであるかどうかを無視するようにコンパイラに指示します(または、必要に応じてデフォルト値を設定します)。そして、あなたのviewDidLoad()メソッドで、あなたが知っている関連するビューにそれらを割り当てます。

わかりましたが、これはOODが壊れていますが、これは、ストーリーボードを使用しているときに唯一のオプションです。ビュー/ビューコントローラーのインスタンス化と読み込み/読み込みを担当します。コードをきれいにしたい場合は、viewControllerを定義し、そのビューをnibで設定し、これらのすべてをイニシャライザで処理できます。 (ただし、これらのタスクは高度に処理され、メモリが消費されるため、ビューがロードされたり、ビューがアンロードされるなどのシステムルールに従わなければならないことに注意してください。

+0

助けてくれてありがとう。 – Biken

+0

私が見逃したことの1つ、コードでviewControllerを初期化すると、_can_もストーリーボードで動作するようになりました。 – farzadshbfn

0

さらに質問を起草

SecondViewControllerの3210は、prepare(forSegue:)の後に常にと呼ばれるため、prepare(forSegue:)の範囲内にあります。IBOutletSecondViewControllerはまだ接続されていません。

+0

したがって、 'SecondVoiceData:String?'の 'SecondViewController'の他のプロパティは' prepare(forSegue:) 'に接続されていますか? – Biken

+0

はい、しかし、プロパティは決して接続されません*。 View Controllerインスタンスのプロパティは** initialized **ですが、関連付けられたビューは**まだロードされていません**。 – vadian