2013-12-23 13 views
6

Ich versuche, ein Label in der zweiten VC von der ersten VC innerhalb der PrepareForSegue-Methode zu aktualisieren.iOS >> prepareForSegue >> IBOutlet Update funktioniert nicht?

-(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 
} 

Wenn ich das Label direkt aktualisieren, es funktioniert nicht. Wenn ich eine String-Eigenschaft aktualisiere und sie dann der Beschriftung in der zweiten VC-AnsichtDidLoad zuweise, funktioniert sie.

Bedeutet es, dass bei prepareForSegue Aufruf die zweite VC viewDidLoad Methode noch nicht aufgerufen wurde?

Wurde eine Init-Methode aufgerufen (so dass das NSString-Objekt übergeben werden konnte)? Wenn ja, welche?

Gibt es eine Möglichkeit, IBOutlets im 2. VC vom 1. VC zu aktualisieren?

Antwort

2

Wenn Sie in dieser Zeile in „prepareForSegue“ Methode hinzufügen:

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

Sie werden sehen, dass die Ansicht nicht geladen wurde, bis es Zeit für sie zu erscheinen (die nach prepareForSegue passiert). Aus diesem Grund arbeitet die von Ihnen verwendete datePassString-Eigenschaft, während die IBOutlets null sind, bis die Ansicht geladen ist.

8

Die kurze Antwort lautet: Tu das nicht.

Sie sollten die Ansichten eines anderen View-Controllers als privat behandeln und niemals versuchen, sie zu manipulieren. Es bricht das OOD-Prinzip der Kapselung.

Was Sie tun möchten ist, Eigenschaften (String oder andere Art) zu Ihrem Ziel-View-Controller hinzuzufügen und THOSE in prepareForSegue einzustellen. Kopieren Sie dann in der viewWillAppear-Methode des Zielsteuerungscontrollers diese Eigenschaftswerte in die View-Controller-Ansichten.

In Ihrem Fall ist die Eigenschaft datePassString genau das, was Sie möchten.

Wenn Sie die Struktur Ihres zweiten Ansichtscontrollers auf der Straße ändern und beschließen, die Informationen in einer anderen Ansicht anzuzeigen, wird die Verknüpfung zwischen den beiden Ansichtscontrollern nicht aufgehoben. Ihr Zielansicht-Controller kann die Daten immer noch von der Quelle abrufen und etwas anderes damit machen.

P.S. Wie das andere Poster schon sagte, ist der Grund dafür, dass secondVC.titleLabel.text fehlschlägt, dass in prepareForSegue die Ansichten des Ziel-View-Controllers noch nicht geladen wurden.

Verwandte Themen