2013-01-04 7 views
9

Ich habe eine View-Controller, dass, wenn ich eine Taste drücken ein Kinder-View-Controller erscheinen. Das funktioniert perfekt, aber ich möchte diesen Kind-View-Controller für einen anderen ändern, wenn ich den nächsten Knopf drücke, der sich in diesem befindet, um eine Anmeldung in zwei Schritten zu machen. Irgendeine Idee? Weil ich vom Hauptansicht-Controller weiß, wie man ein Kind zeigt, aber vom Kind weiß ich nicht, wie man es macht.Change Kind View-Controller

+1

Wenn wir hier von benutzerdefinierten Containeransichtscontrollern sprechen, können Sie das Kind dazu veranlassen, eine Methode zurück zum übergeordneten Element aufzurufen, um den Übergang durchzuführen. Oder Sie können ein benutzerdefiniertes Segment erstellen, das einen Kind-Controller ersetzt: http://stackoverflow.com/questions/14125145/ios-best-practices-for-a-one-way-navigation-controller/14125580#14125580 – Rob

+0

Vielen Dank für du antwortest. Also muss ich zum Elternteil zurückkehren und den anderen View-Controller als Kind zeigen. Aber wie weiß ich, dass ich dem anderen zeigen will. Weil ich versuche, das Kind wie segue zu ersetzen, aber der neue View-Controller erschien in allen Fenstern nicht wie der erste. – Anna

+0

Ok, endlich bekomme ich das benutzerdefinierte Segment, das ein Kind ersetzt. :) – Anna

Antwort

44

Storyboards Wenn verwenden, können Sie Ihr eigenes Kind ersetzen segue, zum Beispiel erstellen:

ReplaceSegue.h

@interface ReplaceSegue : UIStoryboardSegue 

@end 

ReplaceSegue.m

@implementation ReplaceSegue 

- (void)perform 
{ 
    UIViewController *source = self.sourceViewController; 
    UIViewController *destination = self.destinationViewController; 
    UIViewController *container = source.parentViewController; 

    [container addChildViewController:destination]; 
    destination.view.frame = source.view.frame; 
    [source willMoveToParentViewController:nil]; 

    [container transitionFromViewController:source 
          toViewController:destination 
            duration:0.5 
            options:UIViewAnimationOptionTransitionCrossDissolve 
           animations:^{ 
           } 
           completion:^(BOOL finished) { 
            [source removeFromParentViewController]; 
            [destination didMoveToParentViewController:container]; 
           }]; 
} 

@end 

Anschließend können Sie das Storyboard öffnen, Setzen Sie eine Containeransicht auf den Controller für die Containeransicht, und legen Sie auf der untergeordneten Steuerung einen benutzerdefinierten Übergang von der ersten untergeordneten Szene zur zweiten untergeordneten Szene fest. Sie verlassen nun die ReplaceSegue Klasse für die benutzerdefinierte segue zwischen den beiden Kinderszenen angeben mögen:

container controller storyboard

Beachten Sie, dass, wenn Sie richtig automatisches Layout oder automatisch angepasst wird auf der zweiten Kind Ansicht verwendet haben, wird alles gut funktionieren (vor allem mit der manuellen Einstellung des Rahmens der Sicht des Zielcontrollers in der ReplaceSegue). Aber im Interface Builder sieht das Layout dieser zweiten untergeordneten Szene nicht ganz richtig aus und kann das richtige Design der Szene ein wenig peinlich machen, weil (zumindest ab Xcode 4.5) die "simulierten Metriken" für das zweite Kind sind Die Szene macht keine gute Arbeit, wenn man die richtige Größe heranzieht. Also sollten Sie wahrscheinlich, dass das zweite Kind Szene Größe simulierte Metriken ändern von ‚Inferred‘ auf ‚Freiform‘ und dann manuell die Größe des zweiten Kindes Szene anzupassen:

container storyboard with manually adjusted second child scene size

Es ist nicht sehr elegant Xcode Erfahrung, aber Es klappt. Und wenn Sie Auto-Layout- oder Autosizing-Masken richtig verwenden, werden kleinere Variationen sehr elegant gehandhabt.

+4

Beachten Sie, dass es möglich sein sollte, einen Dummy- "Push" -Schnitt zwischen Child View 1 und Child View 2 hinzuzufügen, um Xcode zu zwingen, die Metriken richtig abzuleiten – esad

+0

@esad Das ist ein cleverer Trick. Vielen Dank! – Rob

+0

Hey @Rob: Danke SEHR VIEL! Ich habe zwei Tutorials und die Apple-Dokumentation verfolgt, um diesen einfachen Übergang zu machen, und Ihre Antwort hat mir gerade dabei geholfen, diese Navigationsprobleme in ein paar Minuten zu lösen ... Also, wenn es nicht so elegant ist? Es ist BRILLANT :-) –