2016-06-25 6 views
0

私は非常に迅速です。そしてあなたの助けが必要です! ユーザが2回目にログインすると、アプリケーションはCoreViewという名前の次のView Controllerに直接アクセスする必要があります。それは詳細を求めるべきではありませんが、私はなぜそれが動作しているのか分かりません。そして、それはアプリが起動されるたびに詳細を求めています。以下のコードを確認してください。私はあまりにもエラーの任意の並べ替えを取得していない。アプリが強制終了またはログアウトされない限り、ユーザーは直接ログインできなくてはなりません。NSUserDefaultsのコードが動作しません

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) 

} 

とのviewDidLoad機能で:

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() 

} 

ありがとう! 、 USER_IDとuser_otpを取得し、基本的な資格情報を提供することにより、ログイン用のAPIを呼び出します。

+1

あなたは、アプリケーションが実行されている間のみ状態を維持したい場合は、あなたが維持する必要はありませんアプリが殺された状態。 「UserDefaults」に状態を格納する必要はありません。 とにかく、「UserDefaults」にいくつかの状態を保存する場合は、保存された値をチェックし、その値に基づいて決定を下す必要があります。私は 'UserDefaults'に格納されている値について、あなたのコードのチェックを見ることができません。 –

+0

まず、状態ではなくデータを保存したい。私がプリファレンスでオブジェクトを作成しているとき。それはそこに保管されるべきです。そして、もし私が何らかの形で間違っていたら、私にこれを案内してください。私はUserDefaultsにアプリが殺される瞬間まで詳細を保存したい。 – Mili

+0

書き込みメソッドでは、正しい方法で書き込みを行っていますが、viewDidLoadでは値を読み取っているだけで、それらをチェックすることはありません。読み込む前に、おそらく意味のない書き込みメソッドを呼び出します。また、あなたは常に "ContinueToCoreView" segueを発射しても意味がありません。最初のView ControllerのviewDidLoadですか? –

答えて

1

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 
} 

ログインクラス

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 
    } 
} 

としてクラスを作成します。 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

私はこれにはとても新しいです。私はあなたが言っているものを得ていない。私はあなたのコードをトライする。それは私にエラーを与える。あなたの連絡先IDまたは番号を共有して、私があなたにできないようにして、疑いをなくすことができますか?このプロジェクトは私にとって非常に重要で、私はこれを提供する時間はほとんどありません。 – Mili

1

この方法で試してください。私はちょうどあなたのコードを並べ替えました。
最初に、初期View Controllerのdidloadメソッドでログイン資格情報をチェックします。存在しない場合は、メソッドpref_write()を呼び出します。 pref_write()メソッドで使用される値ではないことを確認してください皆無

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) 

} 

はホープその作業...

+0

ありがとう@Paulson Varghese – Mili

関連する問題