8

Meine Einrichtung ist einfach, und mein Problem unterscheidet sich nicht sehr von this one. Aber um es besser zu erklären, habe ich es hier gepostet:iOS: isMovingToParentViewController funktioniert nicht wie erwartet

NavController -> VC1 -> VC2 

VC1 ist Root-View-Controller von NavController. VC2 ist über Push-Strecke von VC1 zugänglich.

Ich möchte erkennen, innerhalb VC1, ob:

Es direkt als Root-View-Controller erschienen (via Push) Es als Folge der VC2 erschien

geknallt werden ich die Dokumentation lesen, die sagt folgende sollte mir sagen, ob später stimmt.

isMovingToParentViewController == NO 

Das ist jedoch nicht der Fall, und obige Bedingung stellt sich IMMER als WAHR heraus. Das bedeutet, dass (self.isMovingToParentViewController == NO) immer passiert.

Hier ist mein Code:

- (void) viewWillAppear:(BOOL)animated 
{ 
    [super viewWillAppear:animated]; 
    self.navigationController.navigationBarHidden = YES; 

    //pushed to stack 
    if (self.isMovingToParentViewController == YES) 
    { 
     //First time 
     } 
    else 
    //popped off 
    { 
     //via Pop from VC2 
    }  
} 

Elbe ist der Fall für viewDidAppear auch.

Für eine Tatsache zu überprüfen, habe ich am Anfang Breakpoint, und überprüft, dass alle folgenden sind FALSCH, in beiden Fällen:

([self isMovingFromParentViewController]) 
([self isMovingToParentViewController]) 
([self isBeingPresented]) 
([self isBeingDismissed]) 

Was geschieht? Gibt es irgendetwas, was ich in meinem Storyboard ausgelassen habe? Bitte helfen ...

+1

Hilft es, wenn Fügen Sie den erwarteten Aufruf von '[super viewWillAppear: animated];' zum Start Ihrer 'viewWillAppear:' Methode hinzu? – rmaddy

+0

Ich habe diese Zeile ganz am Anfang von 'viewWillAppear' eingefügt, aber zu keinem Ergebnis. –

+0

Alle vier dieser Methoden sollten "NO" in "VC1" zurückgeben, wenn "VC2" aufgerufen wird. Aber ich würde erwarten, dass 'isMovingToParentViewController' zum ersten Mal' YES' zurückgibt, wenn 'VC1' angezeigt wird. – rmaddy

Antwort

11

Leider ist isMovingToParentViewController für die Root-View-Controller ist nicht wahr, so dass ich in der Regel behandeln diese Situation mit einem BOOL,

@implementation ViewController { 
    BOOL isFirstAppearance; 
} 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    isFirstAppearance = YES; 
} 

-(void)viewDidAppear:(BOOL)animated { 
    [super viewDidAppear:animated]; 
    if (isFirstAppearance) { 
     NSLog(@"root view controller is moving to parent"); 
     isFirstAppearance = NO; 
    }else{ 
     NSLog(@"root view controller, not moving to parent"); 
    } 
} 
3

Da es scheint, dass isMovingToParentViewController nur gesetzt, wenn ein Viewcontroller auf den Navigationsstapel geschoben wird, und nicht für die anfänglichen RootViewController gesetzt, würde ich vorschlagen, die folgende Verwendung:

if([self.navigationController.viewControllers containsObject:self]) 
{ 
    // being popped to self here 
} 
else 
{ 
    // being pushed here 
} 
+0

Aber würde das "if" nicht wahr sein, wenn "self" der Root-Controller ist und zum ersten Mal angezeigt wird? – rmaddy

+0

Sieht aus, als ob du @rmaddy korrekt bist. Vermutung, ich habe es noch nie zuvor für den rootViewController verwendet ... –

+0

@rmaddy hat Recht. 'if ([self.navigationController.viewControllers containsObject: self])' stellt sich immer als TRUE heraus. –

3

Eine einfache Lösung ist das Hinzufügen eines Flags unter viewWillDisappear, das auf YES gesetzt wird, wenn VC1 nicht mehr vorhanden ist. Sonst war die Ansicht nie verschwunden, daher ist es der erste Druck (RootViewController von Navigation Controller).

Beispielcode

BOOL hasDisappeared; 

-(void)viewWillAppear:(BOOL)animated 
{ 
    if (hasDisappeared==YES) { 
     //VC2 has been popped 
    } 
    else 
    { 
     //VC1 is the rootViewController 
    } 
} 

-(void)viewWillDisappear:(BOOL)animated 
{ 
    //Pushing to VC2 
    hasDisappeared=YES; 
} 
+1

Ich habe gerade eine sehr ähnliche Antwort eingegeben. Ich mache das schon lange bevor die 'isMovingToParentViewController' Methode hinzugefügt wurde. – rmaddy

+0

Dies ist der einfachste Weg, eine andere Methode, die ich schreiben wollte, war @rdelmar für viewDidLoad, aber ich kam gerade auf diese Idee. – EridB

+0

Kann 'UINavigationControllerDelegate' helfen? Dieser Ansatz ist ziemlich einfach, aber nicht unbedingt Push-Pop-Sache. Überraschend, wir haben so viele Methoden und keine davon nützlich! –