2016-06-25 10 views
0

Ich bin sehr neu zu swift. Und brauche deine Hilfe! Ich möchte, dass, wenn sich der Benutzer zum zweiten Mal anmeldet, die App es direkt zum nächsten View-Controller namens CoreView bringen soll. Es sollte nicht nach Details fragen, aber ich weiß nicht, warum es nicht funktioniert. Und es fragt jedes Mal nach Details, wenn die App gestartet wird. Bitte überprüfen Sie den folgenden Code. Ich bekomme auch keinen Fehler. Solange und bis die App beendet oder ausgeloggt wird, sollte sich der Benutzer direkt anmelden können.Mein Code für NSUserDefaults funktioniert nicht

func pref_write() 
{ 
    // To write the data to NSUserDefaults 

    let prefs = NSUserDefaults.standardUserDefaults() // make a reference 
    print("OTP:\(OTP)") 

    // Adding values. Creating objects in prefs 
    prefs.setObject(OTP, forKey: "OTP") 
    print("check_OTP:\(check_OTP)") 

    prefs.setObject(U_ID, forKey: "U_ID") 
    print("Check_U_ID:\(check_U_ID)") 
    prefs.synchronize() 
    self.performSegueWithIdentifier("ContinueToCoreView", sender: self) 

} 

Und in der viewDidLoad Funktion:

override func viewDidLoad() 
{ 

    super.viewDidLoad() 
    //Read the data 
    self.performSegueWithIdentifier("ContinueToCoreView", sender: self) 
    pref_write() 
    let prefs = NSUserDefaults.standardUserDefaults() 
    check_OTP = prefs.objectForKey("OTP")! 
    check_U_ID = prefs.objectForKey("U_ID")! 
    prefs.objectForKey("U_ID") 
    print("prefs:\(prefs)") 
    prefs.synchronize() 

} 

Dank!

+1

Wenn Sie nur einen Zustand halten wollen, während die Anwendung ausgeführt wird, und Sie wollen nicht halten der Zustand, als die App getötet wurde; Sie müssen den Status daher nicht in den 'UserDefaults' speichern. Wie auch immer, wenn Sie einen Zustand in 'UserDefaults' speichern, sollten Sie den gespeicherten Wert überprüfen und basierend auf seinem Wert Ihre Entscheidung treffen. Ich sehe in Ihrem Code keine Überprüfungen von Werten, die Sie in 'UserDefaults' speichern. –

+0

Erstens möchte ich die Daten speichern, und nicht den Zustand. Wenn ich Objekte in Prefs erstelle. Es sollte dort gespeichert werden. Und wenn ich in irgendeiner Weise falsch liege ... bitte führe mich durch das. Ich möchte die Details in UserDefaults speichern, bis die App beendet ist. – Mili

+0

In Write-Methode schreiben Sie auf korrekte Weise, aber in ViewDidLoad lesen Sie nur die Werte und überprüfen sie nie und auch vor dem Lesen sind Sie Call-Write-Methode, die wahrscheinlich keinen Sinn machen. Außerdem feuern Sie immer den "ContinueToCoreView" -Schnitt, der auch keinen Sinn ergibt. Ist es die ViewDidLoad Ihres ersten View-Controllers? –

Antwort

1

Erstellen Sie eine Klasse als

class User_Details : NSObject 
{ 
    var user_id : String? 
    var user_otp : String? 
    var otp_verified : Bool? 

    init(u_id:String, otp:String?, verified:Bool) 
    { 
     super.init() 
     self.user_id = u_id 
     self.otp_verified = verified 
     self.user_otp = otp 
    } 
} 

In AppDelegate,

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool 
{ 
    navController = self.window?.rootViewController as? UINavigationController 
    if self.checkIfUserLoggedIn() 
    { 
     let user_details = NSUserDefaults.standardUserDefaults().objectForKey("user_details") as! User_Details 
     self.moveToNextScreen(user_details) 
    } 
    return true 
} 

//AppDelegate Class or in the class which is globally accessible 
func pref_write_user(user_details : User_Details) 
{ 
    let prefs = NSUserDefaults.standardUserDefaults() 
    prefs.setObject(user_details, forKey: "user_details") 
    prefs.setBool(true, forKey: "is_user_login") 

    //After saving the OTP for current user, check for otp verified, move to OTP Screen 
    self.moveToNextScreen(user_details) 
} 

func moveToNextScreen(user_details : User_Details) 
{ 
    if user_details.otp_verified == false 
    { 
     // Move to OTP screen 
     let viewController = self.navController?.storyboard?.instantiateViewControllerWithIdentifier("otpScreen") 
     self.navController?.pushViewController(viewController!, animated: false) 
    } 
    else // Move to Home Screen 
    { 
     let viewController = self.navController?.storyboard?.instantiateViewControllerWithIdentifier("homeScreen") 
     self.navController?.pushViewController(viewController!, animated: false) 
    } 
} 

func logoutUser() 
{ 
    let prefs = NSUserDefaults.standardUserDefaults() 
    prefs.setObject(nil, forKey: "user_details") 
    prefs.setBool(false, forKey: "is_user_login") 
} 

func checkIfUserLoggedIn() -> Bool 
{ 
    let prefs = NSUserDefaults.standardUserDefaults() 

    if prefs.boolForKey("is_user_login") 
    { 
     if let _ = prefs.objectForKey("user_details") 
     { 
      return true 
     } 
     else 
     { 
      //User details not found for some reason, so setting the inital values and return false 
      self.logoutUser() 
     } 
    } 

    return false 
} 

Login-Klasse: Rufen Sie die API für die Anmeldung durch die grundlegende Credential, erhalten die user_id und user_otp, Speichern Sie sie in NSUserDefaults

func requestLoginToServer() 
{ 
    //Perform basic server action 
    .... 
    //In Success Block write this 
    let appDel = UIApplication.sharedApplication().delegate as! AppDelegate 
    // pass the values as return by the server 
    let user_details = User_Details(u_id: "123", otp: "1234", verified: false) 
    appDel.pref_write_user(user_details) 
    appDel.moveToNextScreen(user_details) 
} 
+0

Ich bin sehr neu dazu. Ich verstehe nicht, was du sagst. Ich habe deinen Code. aber es gibt mir einen Fehler. kannst du bitte deine kontaktnummer oder nummer teilen, damit ich dir nicht helfen kann und meine Zweifel beseitigen kann. Dieses Projekt ist sehr wichtig für mich und ich habe kaum Zeit dies zu leisten. – Mili

1

Bitte versuchen Sie es auf diese Weise. Ich habe deinen Code einfach neu geordnet.
Zuerst wird es die Anmeldeinformationen mit in der Didload-Methode der ursprünglichen Ansicht Controller überprüfen. Wenn nicht, ruft es die Methode pref_write() auf. Bitte stellen Sie sicher, dass die verwendeten Werte in pref_write() -Methode nicht nil

override func viewDidLoad() 
{ 
    super.viewDidLoad() 

    let prefs:NSUserDefaults = NSUserDefaults.standardUserDefaults() 
    // You can give conditions for your need like if(prefs.valueForKey("U_ID") != nil)) 
    // It will check the user defaults whether you already login 
    if(prefs.valueForKey("OTP") != nil) { 

      self.performSegueWithIdentifier("ContinueToCoreView", sender: self) 
    } 

    else{ 

     pref_write() 
    } 
} 


// Make sure the Values are not nil 

func pref_write() 
{ 
     // To write the data to NSUserDefaults 

     let prefs = NSUserDefaults.standardUserDefaults() // make a reference 
     print("OTP:\(OTP)") 

    // Adding values. Creating objects in prefs 
     prefs.setObject(OTP, forKey: "OTP") 
     print("check_OTP:\(check_OTP)") 

     prefs.setObject(U_ID, forKey: "U_ID") 
     print("Check_U_ID:\(check_U_ID)") 
     prefs.synchronize() 
     self.performSegueWithIdentifier("ContinueToCoreView", sender: self) 

} 

Hoffnung seine Arbeits ...

+0

Vielen Dank @Paulson Varghese – Mili