2014-11-05 12 views
5

È tipico durante l'avvio dell'app per creare la struttura dell'interfaccia utente principale, ma durante l'accesso se l'utente non ha effettuato l'accesso durante l'avvio dell'app, presenta immediatamente una schermata di accesso/accesso modale sopra l'interfaccia utente normale.presentViewController: animato: NO mostra brevemente la presentazione del controller in iOS 8. Alternative?

Normalmente è stato corretto presentare l'interfaccia utente modale utilizzando presentViewController:animated:NO, perché l'utente vedrebbe: Immagine di avvio dell'app -> UI di accesso.

Tuttavia, su iOS 8, sembra chiamando presentViewController con animata = NO ancora brevemente mostra la vista controllore sottostante per un telaio prima di presentare il controller della vista.

Esempio:

Non voglio presentare l'interfaccia utente di login prima, perché quando l'utente connesso sarei presentando utente principale dall'interfaccia utente di login, in tal modo mantenendo l'interfaccia utente di accesso in giro nella gerarchia indefinitamente.

C'è un altro modo che non ho considerato? Gli storyboard potrebbero aiutarmi qui?

+1

Dove nel tuo codice stai chiamando 'presentViewController: animated:'? –

+0

Si prega di includere il codice e dire da dove lo si chiama. – jrturton

+0

Ciao @DanielT, sto chiamando presentViewController durante 'applicationDidFinishLaunching: withOptions'. –

risposta

2

Personalmente controllo lo stato di accesso all'avvio dell'applicazione, quindi installa il controller di visualizzazione di accesso o il controller di visualizzazione radice principale come controller di visualizzazione radice della finestra.

Quando l'utente esegue l'accesso o l'uscita, il controller della vista radice della finestra viene sostituito. Anche questo può essere animato. Trovo questo approccio abbastanza pulito.

+0

Interessante, non sapevo che la sostituzione del controller della vista radice potesse essere animata, usando '[UIView transitionFromView: toView: duration: options: completion]'! Questo ha risolto il problema per me, anche se come ha detto @ anna-dickinson, puoi usare anche gli storyboard. –

+0

Io uso anche gli storyboard, solo non con un set come interfaccia principale in casi come questo. – jrturton

1

Suppongo che il problema scompaia se si utilizzano gli storyboard e non si crea un'istanza programmatica dei controller di visualizzazione iniziali o di accesso. UIKit sembra funzionare meglio quando si lascia solo fare la sua cosa ...

Ecco come portare condizionalmente il controller della vista di login utilizzando uno storyboard:

https://stackoverflow.com/a/26657778/1442620

+0

Grazie per questo! Il 100% è d'accordo sul fatto che non dovresti combattere contro UIKit. Detto questo, Apple non ha decretato che gli storyboard sono necessari per il lancio di un'app, e che _non_ usarli è sbagliato. Sono molto potenti e utili per moltissime app e sono d'accordo che potrebbe risolvere il mio problema anche qui. –

1

non so che cosa il vostro esatto è il caso, ma nella mia app l'utente può essere disconnesso in qualsiasi momento indipendentemente dal controller di visualizzazione in cui si trova. Devo quindi presentare la schermata di accesso e dare all'utente la possibilità di accedere nuovamente, e rimettere l'utente esattamente dove si trovava se l'accesso è andato a buon fine.

Ciò significa che non posso rendere il controller di visualizzazione di login la radice e impilare gli altri controller su di esso, perché non posso semplicemente escluderli tutti se l'utente viene disconnesso.

Tuttavia, posso salvare lo stack VC e passare alla schermata di accesso, quindi passare allo stack VC principale quando l'accesso è riuscito.

class AppDelegate: UIResponder, UIApplicationDelegate { 

    var window: UIWindow? 
    var primaryViewController: UIViewController? 
    var loginViewController: UIViewController? 

    func userLoggedOut() { 
     self.window?.rootViewController = loginViewController 
    } 

    func userLoggedIn() { 
     self.window?.rootViewController = primaryViewController 
    } 

    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { 
     // other setup code 
     let storyboard = UIStoryboard(name: "Main", bundle: nil) 
     loginViewController = storyboard.instantiateViewControllerWithIdentifier("LoginViewController") as? UIViewController 
     primaryViewController = self.window?.rootViewController 

     if (!currentlyLoggedIn) { 
      userLoggedOut() 
     } 
     return true 
    }