2016-10-28 1 views
4

Ich habe eine App und einen Durchlauf Bildschirm und ich möchte den Durchlauf Bildschirm anzeigen, wenn der Benutzer die App zum ersten Mal öffnen, aber ich mache es falsch. Sollte ich den Code in den AppDelegate oder in den ViewDidLoad innerhalb meines ersten Bildschirms einfügen. Hier ist der Code, den ich verwendet:Erfolglose Erkennung der ersten App-Start, wie soll ich es tun?

super.viewDidLoad() 

    if UserDefaults.standard.bool(forKey: "isFirstLaunch") { 

     UserDefaults.standard.set(true, forKey: "isFirstLaunch") 
     UserDefaults.standard.synchronize() 
    } 
    let isFirstLaunch = UserDefaults.standard.value(forKey: "isFirstLaunch") as? Bool 
    if isFirstLaunch! { 

      let mainStoryboard = UIStoryboard(name: "ViewController", bundle: Bundle.main) 
      let vc : ViewController = mainStoryboard.instantiateViewController(withIdentifier: "ViewController") as! ViewController 
      self.present(vc, animated: true, completion: nil) 


    } 

und ein Bild des Fehlers:

enter image description here

Alle Iden, wie es zu tun?

+0

Ich habe einen Code auf GitHub, der eine ähnliche Arbeit macht. Hier ist der Link: https://github.com/karanthakakr04/Walkthrough-Demo.git Ich hoffe, dass es Ihren Bedürfnissen dient. Außerdem gibt es dieses Referenz-Tutorial, wenn es jemand benötigt: https://youtu.be/tNCsQe5vfRk –

Antwort

1

The (Apple) empfohlene Verfahren ist zu Register der Standardwert (wie die Klasse Benutzer Defaults impliziert).

So bald wie möglich - zum Beispiel in applicationWillFinishLaunching - Delegierter

let defaultValues = ["isFirstLaunch" : true] 
UserDefaults.standard.register(defaults: defaultValues) 

Der früheste Zeitpunkt ist die init Verfahren in Anwendung einfügen

override init() 
{ 
    let defaultValues = ["isFirstLaunch" : true] 
    UserDefaults.standard.register(defaults: defaultValues) 
    super.init() 
} 

einfach Dann

schreiben
func viewDidLoad() 
    super.viewDidLoad() 
    let defaults = UserDefaults.standard 
    if defaults.bool(forKey: "isFirstLaunch") { 
     defaults.set(false, forKey: "isFirstLaunch") 
     let mainStoryboard = UIStoryboard(name: "ViewController", bundle: Bundle.main) 
     let vc : ViewController = mainStoryboard.instantiateViewController(withIdentifier: "ViewController") as! ViewController 
     self.present(vc, animated: true, completion: nil) 
    } 
} 

Die Standardwert ist un Bis es sich beim ersten Mal geändert hat.

+0

soll ich Defaultvalues ​​= schreiben lassen [ "isFirstLaunch": true] UserDefaults.standard.register (Standard: Defaultvalues) im AppDelegate und dann der Rest in der viewDidLoad oder alles in einem Viewcontroller – Ivan

+0

Ja, in AppDelegate, in in jedem Fall müssen Sie sicherstellen, dass die Zeilen zur Registrierung des Defaultwertes ** vor der 'viewDidLoad' Methode im View Controller ausgeführt werden. – vadian

+0

Ich bekomme ein Fehlersignal SIGBART, wenn ich die App zum ersten Mal starte. Ich habe es in der Anwendung platziertWillFinishLaunching Aber es funktioniert immer noch Irgendwelche Ideen? :( – Ivan

0

Ihr Fehler hat mit dem Auspacken eines optionalen Werts zu tun. Was Sie tun sollten, ist zu überprüfen, ob es überhaupt einen Wert in den Benutzereinstellungen gibt.

if let isFirstLaunch = UserDefaults.standard.bool(forKey: "isFirstLaunch") { 
    //execute code for when it isn't the first launch 
} else { 
    //set value of isFirstLaunch for the first time 
} 

Wenn isFirstLaunch null ist, bedeutet das, dass es der erste Start ist.

+0

'UserDefaults bool (forKey:)' gibt kein optionales zurück. Dieser Code wird nicht kompiliert. – rmaddy

2

Sie haben eine Reihe von Problemen:

  1. Sie unnötig den Schlüssel auf true gesetzt sie es ist schon wahr
  2. Sie rufen unnötig synchronize
  3. Sie verwenden value(forKey:) statt bool(forKey:)
  4. (Und das ist die Ursache Ihres Absturzes) Sie entpacken nicht den Wert, den Sie erhalten, was bedeutet, dass Ihre App abstürzt, wenn der Wert
ist

Alles, was Sie brauchen, ist etwas wie folgt aus:

let defaults = UserDefaults() 
if !defaults.bool(forKey:"walkthroughShown") { 
    defaults.set(true, forKey:"walkthroughShown") 
    // Display your Walkthrough 
} 

viewDidLoad wird als Standort für diesen Code nicht funktioniert, und Sie würden mit diesem Code in AppDelegate besser die Lösungsweg oder Ihre erste zu präsentieren view-Controller

+0

danke, was sollte der Code für die Anzeige der Walkthrough sein? – Ivan

0

sollten Sie den Wert auszupacken zuerst:

if let isFirstStart = UserDefaults.standard.value(forKey: "isFirstLaunch") as? Bool { 
    // the isFirstStart value exists, you can check the value 
} else { 
    // the isFirstStart value does not exist 
} 

Ich denke isFirstStart eine schlechte Formulierung Konvention ist, weil es nicht in der ersten Zeit wahr sein kann (weil es vor nicht eingestellt wurde). Sie sollten zum Beispiel hasStarted verwenden, was anzeigt, wenn der Wert nicht existiert, er wurde noch nicht vorher gestartet, falls vorhanden und wahr, war es.

Hoffe, das hilft, zögern Sie nicht zu fragen.

Verwandte Themen