【问题标题】:My code for NSUserDefaults is not working我的 NSUserDefaults 代码不起作用
【发布时间】:2016-06-25 05:46:18
【问题描述】:

我对 swift 很陌生。并且需要你的帮助! 我希望,当用户第二次登录时,应用程序应该直接将其带到名为 CoreView 的下一个视图控制器。它不应该询问细节,但我不知道为什么它不起作用。每次启动应用程序时都会询问详细信息。请检查以下代码。我也没有收到任何错误。除非并且直到应用程序被终止或注销,否则用户应该能够直接登录。

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

}

谢谢!

【问题讨论】:

  • 如果您只想在应用程序运行时保持状态,而不希望在应用程序终止时保持状态;因此您不需要将状态存储在“UserDefaults”中。无论如何,如果您将某些状态存储在“UserDefaults”中,则应检查存储的值并根据其值做出决定。我在您的代码中看不到对您存储在“UserDefaults”中的值的任何检查。
  • 首先,我想存储数据,而不是状态。当我在首选项中创建对象时。它应该存储在那里。如果我有任何错误..请指导我完成这个。我想将详细信息存储在 UserDefaults 中,直到应用程序被终止。
  • 在 write 方法中,您正在以正确的方式写入,但在 viewDidLoad 中,您只是读取值而从不检查它们,而且在读取它们之前,您调用的 write 方法可能没有意义。此外,您总是在触发没有意义的“ContinueToCoreView”segue。是你的第一个视图控制器的 viewDidLoad 吗?
  • 是的,它是第一个视图控制器。请帮忙..
  • 我应该怎么做,保存数据,然后在用户第二次登录时触发 segue..?

标签: ios swift swift2 nsuserdefaults


【解决方案1】:

创建一个类

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

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
}

登录类: 通过提供基本凭证调用登录API,获取user_id和user_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)
}

【讨论】:

  • 我对此很陌生。我不明白你在说什么.. 我试试你的代码。但它给了我错误。能否请您分享您的联系 ID 或电话号码,以便我无法联系您并消除我的疑问。这个项目对我来说非常重要,我几乎没有时间来交付它。
【解决方案2】:

请尝试这种方式。我刚刚重新排列了您的代码。
首先,它将在初始视图控制器的 didload 方法中检查登录凭据。如果它不存在,它将调用方法 pref_write() 。请确保 pref_write() 方法中使用的值不是 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)

}

希望它的工作......

【讨论】:

  • 谢谢@Paulson Varghese
猜你喜欢
  • 1970-01-01
  • 2018-10-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-20
  • 1970-01-01
相关资源
最近更新 更多