6

prepareForSegueメソッド内の第1のVCから第2のVCのLabelを更新しようとしています。iOS >> prepareForSegue >> IBOutletのアップデートが動作しない?

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    MYSecondViewController* secondVC = (MYSecondViewController*)segue.destinationViewController; 
    secondVC.titleLabel.text = @"First VC Says: You Are Second!!"; //This doesn't work 
    secondVC.dataPassString = @"First VC Says: You Are Second!!"; //This works + secondVC viewDidLoad 
} 

ラベルを直接更新すると機能しません。 Stringプロパティを更新して、それをSecond VC viewDidLoadのLabelに割り当てると、それは機能します。

prepareForSegueを呼び出すと、2番目のVC viewDidLoadメソッドがまだ呼び出されていないことを意味しますか?

いくつかのinitメソッドが呼び出されましたか(NSStringオブジェクトが渡す可能性があります)?はいの場合はどちらですか?

第1のVCから第2のVCのIBOutletを更新する方法はありますか?あなたはそれが(prepareForSegue後に発生)が表示されるまでの時間ですまで、ビューがロードされていないことがわかります

if(!secondVC.titleLabel) 
    NSLog(@"titleLabel is null and it likely hasn't been loaded yet") 

:あなたは「prepareForSegue」方法でこのラインに追加すると

答えて

2

。そのため、使用しているdatePassStringプロパティは動作していますが、IBOutletはビューがロードされるまでnullです。

8

短い答えは:しないでください。

他のビューコントローラのビューをプライベートとして扱い、それらを操作しようとしないでください。カプセル化のOODの原則を破る。

目的のビューコントローラに(文字列またはその他のタイプの)プロパティを追加し、prepareForSegueにTHOSEを設定します。次に、デスティネーションビューコントローラのviewWillAppearメソッドで、これらのプロパティ値をビューコントローラのビューにコピーします。

あなたのケースでは、datePassStringプロパティはまさにあなたが望むものです。

このように、2番目のView Controllerの構造を変更し、別のビューに情報を表示することにした場合、2つのView Controller間のリンクが切断されることはありません。目的のビューコントローラは、ソースからデータを取得して、別のものを実行することができます。

P.S.他のポスターが述べたように、secondVC.titleLabel.textを設定する理由は、prepareForSegueでは、宛先ビューコントローラのビューがまだロードされていないためです。

関連する問題