2016-07-13 13 views
0

Ich versuche, einige Daten zu meiner View-Controller-Klasse wie folgt passieren:Kann nicht übergebenen Daten in viewDidLoad Methode erhalten

MyViewController *vc = [[MyViewController alloc] init]; 
vc.myProperty = dataToBePassed; 
[self.navigationController pushViewController:vc animated:YES]; 

ich einige Blick in viewDidLoad Konfiguration vornehmen müssen, aber es scheint, dass viewDidLoad früher als Eigentumszuweisung aufgerufen.

Dann in MyViewController Umsetzung:

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    NSLog(@"%@", self.myProperty); // Here i get myProperty = nil 
} 

- (void)viewWillAppear 
{ 
    [super viewWillAppear]; 
    NSLog(@"%@", self.myProperty); // Here i get myProperty = dataToBePassed but it's to late 
} 

Wie kann ich in viewDidLoad Methode übergebenen Daten zu bekommen, ohne Singleton oder delegieren Muster zu implementieren?

+1

Machst du etwas in 'init', das bewirkt, dass die Ansicht geladen wird? Sie können dem Initialisierer einfach einen Parameter hinzufügen und ihn übergeben. – dan

+0

Nein, ich überschreibe die init-Methode in MyViewController nicht. Ist es möglich, eine benutzerdefinierte Initialisierungsmethode für VC zu erstellen? Ich dachte, dass alle Initialisierung Sachen für VC in "ViewDidLoad" Methode stattdessen sein müssen. Liege ich falsch? – rockhard

+1

Wenn Sie Storyboards verwenden, können Sie keinen benutzerdefinierten Initialisierer schreiben, aber wenn Sie den Initialisierer nur manuell aufrufen, können Sie einen benutzerdefinierten Initiator verwenden. – dan

Antwort

0

Während das von Ihnen bereitgestellte Codebeispiel technisch korrekt aussieht, bin ich bei @John-Elemans dabei, dass Sie mehr Code zeigen müssen.

Es gibt etwas, das auf die Ansicht verweist, die es zum Laden bringt und daher viewDidLoad vorzeitig ausgelöst wird.

In jedem Fall, wenn etwas (wie Ihr Eigentum) auf den korrekten Aufbau Ihrer Ansicht Struktur absolut notwendig ist, würde ich in einem eigenen benannten Initialisierer setzen, zum Beispiel

- (id)initWithPhotoDiameter:(CGFloat)diameter 
{ 
    self = [super init...]; // some VC initializer that you should call 
    if (self) { 
     _photoDiameter = diameter; 
    } 

    return self; 
} 

Hinweis der Verwendung der Backing-Instanzvariable _photoDiameter anstelle von self.photoDiameter. Dies ist der einzige Bereich in einer Klasse, in dem Sie den Backing-Ivar verwenden sollten, da self noch initialisiert wird.

+0

Ich habe Ihre Lösung ausprobiert und es funktioniert wie erwartet! Aber ich frage mich immer noch, warum mein Code nicht so funktionierte wie er war. Wenn ich Storyboards verwende, wird die selbe Zuweisung in der 'performSegueWithIdentifier' Methode immer vor dem Aufruf von viewDidLoad durchgeführt. Ich denke, ich werde deine Antwort akzeptieren. Danke an alle, die sich an der Lösung beteiligt haben. – rockhard

1

Versuchen Sie, diese

UIStoryboard *storyboard = [UIStoryboard storyboardWithName: 
          @"MainStoryboard" bundle:[NSBundle mainBundle]]; 

MyViewController *vc = [storyboard instantiateViewControllerWithIdentifier:@"storyboardIdentifier"]; 
vc.myProperty = dataToBePassed; 
[self.navigationController pushViewController:vc animated:YES]; 

Sie haben dabei für die View-Controller zunächst im Storyboard ein Storyboard-Kennung zu setzen.

+0

Ich verwende keine Storyboards oder Nibs. Alles programmgesteuert, möglicherweise verursacht dies Probleme. Aber, danke für die Antwort. – rockhard

+0

Wie überschreiben Sie die Init-Methode? –

0

Technisch gibt es zwei Ansätze, die für die Lebenszyklusbehandlung von View-Controllern, die sich auf eine Anwendung beziehen, durchaus üblich sind.

Mit XIBs Wenn XIBs eine der am häufigsten verwenden, wenn nicht der häufigste Prozess zu erstellen und Setup-Controller Ihrer Ansicht nach ist programmatisch durchgeführt. Nach diesem Prozess haben Sie bei der Initialisierung des Ansichtscontrollers die Möglichkeit, Ihre init-Methode entweder zu überschreiben, damit der View-Controller die Informationen vor dem Laden der Ansicht erhält, und den Prozess zum Anpassen des gezeichneten Inhalts zu vereinfachen. Sie können auch eine Methode in Ihrem View-Controller erstellen, in der Sie die vom View-Controller zu verwendenden Daten übergeben.

Verwenden des Storyboards Wenn Sie Storyboards verwenden, empfehle ich, dass Sie darauf vertrauen, dass die Segmente eingerichtet werden. Ich habe festgestellt, dass sie das Leben erleichtern und es Ihnen ermöglichen, bestimmte Methoden zu verwenden, um den Übergang zu bewältigen. Einer davon ist prepareForSegue:sender: Innerhalb dieser Methode habe ich festgestellt, dass es einfacher ist, einen View-Controller einzurichten, nachdem er auf den Zielcontroller initialisiert wurde. Sie könnten auch in Betracht ziehen, alle Daten vor viewDidLoad zu haben und somit dem Ansatz zu folgen.