2013-04-24 6 views
25

Ho un'applicazione che inizia con un controller di navigazione. Questo controller di navigazione in grado di aprire vista modale regolatore:Come eseguire i passi senza animazione di transizione

- (void)openModalController:(id)sender 
{ 
    [self performSegueWithIdentifier:@"SegueIdentifier"]; 
} 

Ma quando l'utente apre un'applicazione utilizzando schema URL, mi piacerebbe presentare la domanda con il controller modale aperto. Così ho aggiunto alcuni metodi e provato:

// Controller 

- (void)viewDidAppear:(BOOL)animated 
{ 
    [super viewDidAppear:animated]; // animated == NO in initial loading 

    if (_shouldOpenModalController) { 
     [self openModalController:nil]; 
    } 
} 

- (void)setShouldOpenModalController:(BOOL)flag 
{ 
    _shouldOpenModalController = flag; 
} 

// AppDelegate 

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    if (launchOptions) { 
     UINavigationController *nc = (UINavigationController *)self.window.rootViewController; 
     MyViewController *c = (MyViewController *)[ns topViewController]; 
     [c setShouldOpenModalController]; 
    } 
} 

ma qui è un problema: le openModalController: esegue Segue con l'installazione ho l'animazione di transizione in storyboard. Come può essere fatto senza animazione? C'è un altro approccio per questo compito?

+0

sottoclasse 'UISegue' e sovrascrivere' perform'. – Martol1ni

+0

@ Martol1ni prossima volta voglio aprirlo con l'animazione ... Ormai sto usando l'identificatore '- (id) instantiateViewControllerWithIdentifier: (NSString *) 'ma non penso che questa sia la soluzione migliore – voromax

+0

Stai usando segue, vero? – Martol1ni

risposta

32

Duplica i tuoi passi nello Storyboard e dai al secondo un ID diverso.

È quindi possibile modificare la transizione nella nuova versione.

+1

Per creare un altro seguito per provare a saltare l'animazione di transizione su di esso ... Ci deve essere un altro modo, preferirei aprire il controller di visualizzazione manualmente piuttosto che creare una transizione personalizzata senza animazione. – voromax

+14

Non hai bisogno di un seguito personalizzato, c'è una casella di controllo 'animate' sulla transizione modale. –

+0

grazie per la risposta. Questo può funzionare. +1 – voromax

7

Sto usando questo frammento di richiedere l'autorizzazione in viewDidLoad:

[UIView setAnimationsEnabled:NO]; 
self.view.hidden = YES; 

[self performSegueWithIdentifier:@"segue_auth" sender:self]; 

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.4 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ 
    [UIView setAnimationsEnabled:YES]; 
    self.view.hidden = NO; 
}); 

Quando autorizzato, torna la transizione è animata come voglio.

+2

Questa soluzione funziona in Xcode 6+, mentre altri no (la duplicazione successiva non è consentita). – ruliak

+0

@ruliak Non sto duplicando segue. Penso che tu voglia commentare questa risposta :) – k06a

+0

Vorrei poter votare due volte. Sono tornato qui un anno dopo e ho usato di nuovo questo metodo! Ho dimenticato che l'avevo già trovato una volta! – davidethell

5

Un altro modo in cui possiamo

YourViewController *aYourViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"aYourViewControllerIdentifier"]; 
[self.navigationController pushViewController:aYourViewController animated:NO]; 

e aggiungere il @"aYourViewControllerIdentifier" per visualizzare periferica nella storyboard.

+1

Questo è più di una mossa.Se abbiamo già un seguito, non dovremmo istanziare il controller della vista per codice. L'intero punto di avere un seguito è di evitare di istanziare il controller di visualizzazione nel codice. – Kesava

19
self.performSegueWithIdentifier("loginSegue",sender: nil) 

enter image description here