2017-01-26 1 views
1

Ich versuche, eine Anwendung zu entwickeln (immer noch lernen), wo ich einen Anmeldebildschirm präsentieren, die einen Benutzernamen und ein Passwort akzeptiert - das geht dann an einen Web-Service zur Authentifizierung und gibt ein Zugriffs-Token zurück.Wie wird der Anmeldebildschirm nur angezeigt, wenn ein Userdefaults-Schlüssel nicht existiert?

Das Zugriffstoken wird dann in userdefaults gespeichert und zeigt dann einen neuen View-Controller, der Zugriff auf die gesicherten Daten gewährt.

Mein Problem ist, dass, wenn ich meine App schließe - force schließen, fragt sie dann erneut einloggen.

Da mein Login-View-Controller der anfängliche View-Controller ist, fügte ich eine Überprüfung hinzu, um zu sehen, ob ein Access-Token in userdefaults vorhanden ist, und den neuen View-Controller, der Zugriff auf die gesicherten Daten gibt. Jetzt ist mein Problem, dass der Login-Bildschirm immer hinter meinem gesicherten View-Controller geöffnet ist. Wenn Sie die App von Grund auf neu starten, können Sie kurz den Login-View-Controller sehen, bevor der gesicherte View-Controller angezeigt wird.

Wie würde ich das am besten handhaben? Ist der Fall, dass der anfängliche Ansicht-Controller auf den gesicherten Ansicht-Controller gesetzt ist, wenn der Benutzer-Standardschlüssel existiert - aber wie würde ich die Abmelde-Funktion handhaben, als müsste ich 'Pop' 'Root-View-Controller und Benutzer Standardeinstellungen löschen, aber da der Login-Bildschirm nicht in der View-Hierarchie ist, kann ich nicht darauf zurückkommen? Wenn der Anmeldeansicht-Controller beim Abmelden angezeigt wird, ist der gesicherte Ansichts-Controller immer noch unter dem Anmeldeansicht-Controller vorhanden.

Tut mir leid, wenn das ein wenig langatmig ist, aber ich versuche nur das Problem zu beschreiben, das ich habe.

Dank

+0

@Michael, ich schreibe eine Demo und poste den folgenden Hauptcode, auf den du dich beziehen kannst. Wenn Sie die Demo möchten, hinterlassen Sie Ihre E-Mail hier. – aircraft

Antwort

2

Sie müssen nur in der Appdelegate.swift ‚s application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) Verfahren zu beurteilen.

Aber die Voraussetzung ist, dass Sie Handbetrieb sollte das Fenster:

diese Zeile löschen in Ihrem info.plist: enter image description here

Dann in Ihrem AppDelegate.swift Sie Ihre Fenster manuell einstellen:

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { 
    // Override point for customization after application launch. 

    self.window = UIWindow.init(frame: UIScreen.main.bounds) 

    let sb:UIStoryboard = UIStoryboard.init(name: "Main", bundle: nil) 

    let isLogin:Bool = UserDefaults.standard.bool(forKey: "isLogin") 
    if isLogin { 

     let vc2 = sb.instantiateViewController(withIdentifier: "ViewController2") 

     self.window?.rootViewController = vc2 
    }else { 
     let vc1 = sb.instantiateViewController(withIdentifier: "ViewController") 
     self.window?.rootViewController = vc1 
    } 

    self.window?.makeKeyAndVisible() 

    return true 
} 

Und in Ihrem ViewController.swift (Sie können es als LoginVc betrachten):

override func viewDidLoad() { 
    super.viewDidLoad() 

    /* add userdefaults */ 

    UserDefaults.standard.set(true, forKey: "isLogin") 
    UserDefaults.standard.synchronize() 

} 
+0

Dank @Aircraft, das macht Sinn, was Sie tun, aber wie würde ich behandeln behandeln die Anmeldung/Abmeldung als einmal ein Benutzer angemeldet war ich würde den Login-View-Controller loswerden müssen, um Speicher zu sparen und auch beim Abmelden würde ich benötigen um alle anderen View-Controller loszuwerden und den Login-View-Controller einfach in der Hierarchie zu belassen? – Michael

+0

@Michael, Sie können einfach den RootViewController auf den Login vc setzen – aircraft

+0

Ich könnte versuchen, wird das alle anderen aus dem Stapel Pop verlassen den Login-Controller? – Michael

Verwandte Themen