Sto costruendo un'applicazione complessa con una specie di ramo nel mezzo.L'eliminazione di un ViewController più in basso nello stack non si comporta come previsto
Ad un certo punto nell'app viene presentato un particolare UIViewController, lo chiameremo mainViewController
(abbreviato mainVC
).
Il mainVC
presenta un altro controller di vista, per codice, utilizzando il seguente codice (spoglierò su parti di esso per motivi di privacy):
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"SecondaryStoryboard" bundle:secondaryBundle];
SecondViewController *secondVC = [storyboard instantiateInitialViewController];
[self presentViewController:secondVC animated:YES completion:nil];
Così il secondVC
sarà successivamente presentato un altro controllore vista, chiamato thirdVC
. Questo viene fatto utilizzando un segue personalizzato, impostare nello storyboard utilizzato nel codice di cui sopra, che il codice simile al seguente:
@implementation VCCustomPushSegue
- (void)perform {
UIView *sourceView = ((UIViewController *)self.sourceViewController).view;
UIView *destinationView = ((UIViewController *)self.destinationViewController).view;
UIWindow *window = [[[UIApplication sharedApplication] delegate] window];
destinationView.center = CGPointMake(sourceView.center.x + sourceView.frame.size.width, destinationView.center.y);
[window insertSubview:destinationView aboveSubview:sourceView];
[UIView animateWithDuration:0.4
animations:^{
destinationView.center = CGPointMake(sourceView.center.x, destinationView.center.y);
sourceView.center = CGPointMake(0 - sourceView.center.x, destinationView.center.y);
}
completion:^(BOOL finished){
[self.sourceViewController presentViewController:self.destinationViewController animated:NO completion:nil];
}];
}
@end
Come si può vedere questo segue presenta il modale vista di destinazione del controller (mediante l'uso di presentViewController:
) con un'animazione personalizzata (una diapositiva da destra a sinistra).
Quindi praticamente fino a qui è tutto a posto. Presento lo secondVC
con un'animazione modale classica (fa scorrere verso l'alto dal basso) e presenta lo thirdVC
con la mia transizione personalizzata.
Ma quando voglio eliminare lo thirdVC
, quello che voglio è tornare direttamente allo mainVC
. Così ho chiamare il seguente dalla thirdVC
:
self.modalTransitionStyle = UIModalTransitionStyleCoverVertical;
[self.presentingViewController.presentingViewController dismissViewControllerAnimated:_animate completion:nil];
In questo modo, sto chiamando dismissViewControllerAnimated:
direttamente sul mainVC
(a cui fa riferimento self.presentingViewController.presentingViewController
), e mi aspetto il thirdVC
essere respinto con un'animazione, e il secondVC
sparire semplicemente senza animazione.
Come Apple dice nella documentazione UIViewController Classe:
La presentazione controller di vista è responsabile per respingere il controller della vista ha presentato. Se si chiama questo metodo sul controller della vista presentata , esso inoltra automaticamente il messaggio al controller di visualizzazione presentatore .
Se si presentano diversi controller di vista in successione, costruendo così una pila di controller di vista presentati, chiamata a questo metodo su un controller di vista inferiore nello stack respinge il suo immediato Bambini controller e tutti i controller di vista di cui sopra quel bambino in pila. Quando ciò accade, solo la vista più in alto viene ignorata in una modalità animata ; qualsiasi controller di vista intermedio viene semplicemente rimosso dallo stack . La vista più in alto viene ignorata utilizzando lo stile di transizione modale , che può differire dagli stili utilizzati da altri controller di vista inferiori nello stack.
Il problema è che non è quello che succede.Nel mio scenario, lo thirdVC
scompare e mostra lo secondVC
che viene rimosso con l'animazione modale della diapositiva in basso.
Cosa sto sbagliando?
Edit:
Così @ risposta di codeFi è probabilmente lavorando in un progetto classico, ma il problema qui è che sto lavorando su un quadro. Quindi mainVC
si trova in un'app client e lo secondVC
e thirdVC
sono nel mio framework, in uno storyboard separato. Non ho accesso a mainVC
in alcun modo diverso da un riferimento ad esso nel mio codice, quindi i segui di svolgimento non sono purtroppo un'opzione qui.
Questo cambiamento di comportamento si è verificato con iOS 8, in 7 ha funzionato correttamente. Sto cercando di aggirare il problema ora. – theLastNightTrain
@theLastNightTrain: beh sei corretto, succede solo su iOS 8 .. Fammi sapere se trovi qualcosa dalla tua parte .. – rdurand
@theLastNightTrain: Qualche aggiornamento? Sarei lieto di offrire una taglia per una risposta per risolvere questo problema .. – rdurand