2014-05-05 7 views
5

Ich versuche, einen ViewController programmgesteuert in einen Navigationscontroller zu schieben, und ich verwende mein Storyboard, um es zu erstellen.instanziateViewControllerWithIdentifier scheint viewdidload aufzurufen

hier ist mein Code:

+ (void) pushViewController:(NSString *) identifier ForItems:(NSMutableArray *) items sender:(UIViewController *) sender { 
    GenericViewController *viewController = (GenericViewController *)[sender.storyboard instantiateViewControllerWithIdentifier:identifier]; 

    viewController.items = [[NSMutableArray alloc] init]; 
    [viewController.items removeAllObjects]; 
    [viewController.items addObject:[[NSMutableArray alloc] init]]; 
    [viewController.items[0] addObjectsFromArray:items]; 

    [sender.navigationController pushViewController:viewController animated:YES]; 
} 

In GenericViewController viewDidLoad ich meine items verwenden. Dank einiger Breakpoints habe ich gesehen, dass GenericViewController viewDidLoad juste nach der instantiateViewControllerWithIdentifier mit items gleich Null ist.

Ich dachte, dass MyViewController viewDidLoad während der Methode aufgerufen wird.

Irgendwelche Idee, warum viewDidLoad während instantiateViewControllerWithIdentifier aufgerufen wird?

--- Update: ---

Hier mein viewDidLoad

- (void)viewDidLoad 
{ 
    for (MyItem *currentItem in self.items[0]) { 
     [Do Something] 
    } 

    [super viewDidLoad]; 


    [...] 
} 

self.items ist gleich Null. also ist nichts getan.

+0

legte der vollständige Code please..what ist myItem und das viewDidLoad method..the Problem ist nicht this..cause wenn Sie ein Objekt initiieren, es am Leben ist. –

+0

Sie müssen weitere Informationen bereitstellen.Zeigen Sie die gesamte Methode an, in der Sie instanziateViewControllerWithIdentifier: verwenden. Die Methode instantiateViewControllerWithIdentifier: wird nicht dazu führen, dass viewDidLoad aufgerufen wird, sodass etwas anderes passiert. – rdelmar

+0

danke @rdelmar Ich bin mir ziemlich sicher 'instanziateViewControllerWithIdentifier' nicht 'viewDidLoad' aufrufen. Ich aktualisiere meinen Code, ich verwende einen statischen Manager, um meinen neuen viewController zu installieren und zu schieben. –

Antwort

1

Siehe: https://developer.apple.com/library/ios/documentation/uikit/reference/UIViewController_Class/Reference/Reference.html#//apple_ref/occ/instm/UIViewController/viewDidLoad

viewDidLoad aufgerufen wird, wenn die Sicht in den Speicher geladen wird, der Steuerung.

viewWillAppear Benachrichtigt den Ansichtscontroller, dass seine Ansicht einer Ansichtshierarchie hinzugefügt werden soll. Ich denke, das ist, wenn [self.navigationController pushViewController:viewController animated:YES]; aufgerufen wird.

viewDidAppear Benachrichtigt den View-Controller, dass seine Ansicht zu einer Ansichtshierarchie hinzugefügt wurde. Dies ist, wenn MyViewController in navigationController hinzugefügt wird.

+0

Es ist sinnvoll, aber SO Fragen zeigen, dass es eine gute Möglichkeit ist, Eigenschaften an einen View-Controller zu übergeben. (http://stackoverflow.com/a/9666389/1436861, http://stackoverflow.com/a/12709167/1436861) –

0

Wie voyage11 erwähnt, wird viewDidLoad aufgerufen, wenn die Ansicht des Controllers in den Speicher geladen wird, obwohl jemand darauf hingewiesen hat, dass dies nicht unbedingt während der Methode instanziateViewControllerWithIdentifier geschieht.

Ihres Beispielcode folgend, würde ich die Schleife in dem Verfahren viewWillAppear setzen:

- (void) viewWillAppear:(BOOL)animated 
{ 
    [super viewWillAppear:animated]; // good practice to call the super 
    for (MyItem *currentItem in self.items[0]) { 
     [Do Something] 
    } 
} 
+0

Ihre erste Anweisung ist falsch - viewDidLoad wird nicht nur durch Instanziieren eines Ansichtscontrollers aufgerufen. – rdelmar

+0

Guter Punkt. Ich habe meine Antwort aktualisiert, um diese Implikation zu entfernen. –

4

für jeden, der nach wie vor das gleiche Problem haben könnte.

Ich hatte eine ähnliche Situation und löste es nur durch Aufruf von loadViewIfNeeded().

let sb: UIStoryboard = UIStoryboard(name: "Main", bundle: nil) 
let controller = sb.instantiateViewControllerWithIdentifier("LoadingView") as! LoadingViewController 
controller.loadViewIfNeeded() 

Ich könnte dann auf alles innerhalb der Ansicht zugreifen.

+0

Wie die Dokumentation sagt, sollte loadView() niemals direkt aufgerufen werden. https://developer.apple.com/reference/uikit/uiviewcontroller/1621454-loadview – Ramiro

0

Sie können versuchen, verwenden "[self loadViewIfNeeded]" für obj-c oder "self.loadViewIfNeeded()" für rasche; ‚Selbst‘ = Ihre Viewcontroller

apple: loadViewIfNeeded