UserDefaults在我的项目中不适用于didload

时间:2019-05-30 08:22:36

标签: swift nsuserdefaults

我有一个登录屏幕LoginViewController和主屏幕HomeScreenController,在用户成功登录后会被按下)。 我在一个单独的类中为UserDefaults声明了一个变量,如下所示:

class User {
    static var isLoggedIn = UserDefaults.standard.bool(forKey:"islogged")
}

用户单击登录按钮时,代码如下所示

ButtonAction:
{
    User.isLoggedin = true
    //Performsegue........to homescreen
}

ViewDidload {

    if user.isloggedin == true {
        //Performsegue......homescreen
    }
    else {
        Show some alerts
    }
}

在我的情况下...什么都没有发生...抱歉,因为我正在使用智能手机问这个问题,所以粗糙的代码。

我在appdelegate或其他地方缺少什么吗? 我只想按原样使用变量,因为我不想更改项目中的整个代码。 该项目实际上很复杂,我只是举了一个例子让大家了解我的情况。 这不是确切的代码。

7 个答案:

答案 0 :(得分:3)

UserDefaults值使用带有静态变量的类是不好的做法。除此之外,静态变量不会更新UserDefaults中的值。

在按钮操作中,设置UserDefaults中的值并执行segue

@IBAction func login(_ sender : Any)  {
    UserDefaults.standard.set(true, forKey:"islogged")
    performSegue(...
}

viewDidLoad中直接从UserDefaults获取值

func viewDidLoad() {
    super.viewDidLoad()
    if UserDefaults.standard.bool(forKey:"islogged") {
        performSegue(...
    } else {
        // present error
    }

}

答案 1 :(得分:0)

我认为这正在发生,因为您正在User类中调用UserDefaults。在初始化类之前,不会执行此操作。

尝试直接在viewDidLoad()中执行此操作,它应该可以工作。

if UserDefaults.standard.bool(forKey:"islogged") {
    Performsegue......homescreen
}else{
    Show some alerts
}

答案 2 :(得分:0)

尝试用此方法代替您的isLoggedIn代码行

static var isLoggedIn: Bool {
    get {
        return UserDefaults.standard.bool(forKey: "isLoggedIn")
    }
    set {
        UserDefaults.standard.setValue(newValue, forKey: "isLoggedIn")
        UserDefaults.standard.synchronize()
    }
}

答案 3 :(得分:0)

我认为您可能正在尝试实现这一目标:

class User {
    static var isLoggedIn: Bool {
        get {
            return UserDefaults.standard.bool(forKey: "islogged")
        }
        set(aIsLoggedIn) {
            UserDefaults.standard.set(aIsLoggedIn, forKey: "islogged")
        }
    }
}

您的代码存在的问题是您没有保存isLoggedIn的状态,因此在每次启动时,该值始终为false

答案 4 :(得分:0)

我相信您在致电performSegue:时遇到问题。您无法在viewDidLoad上调用此方法,因为尚未完全设置视图控制器。尝试将viewDidLoad移至viewDidAppear

将viewDidLoad代码移至viewDidAppear

override func viewDidAppear(animated: Bool){
    super.viewDidAppear(animated)
    if User.isLoggedIn{
        performSegue("someIdentifier")
    }else{
       //show some alerts. 
    }

}


此外,请为您的isLoggedIn使用计算所得的var。 取自马可:


  static var isLoggedIn: Bool {
        get {
            return UserDefaults.standard.bool(forKey: "islogged")
        }
        set(aIsLoggedIn) {
            UserDefaults.standard.set(aIsLoggedIn, forKey: "islogged")
        }
    }

Perform Segue on ViewDidLoad

答案 5 :(得分:0)

在您的代码中

class User {    
    static var isLoggedIn = UserDefaults.standard.bool(forKey:"islogged")    
}

'isLoggedIn'只是一个值类型。它不会因UserDefaults.standard的某些值而改变。因为您的声明只是为此设置了默认值,所以如果您想拥有一个隐含全局唯一语义的变量,则必须确保在相同的地址处对其进行修改,并从相同的地址处进行获取。

答案 6 :(得分:0)

我认为如果用户已登录,则需要隐藏登录vc,对吗?
在HomeVC中完成

@IBAction func login(_ sender : Any)  {
   if login == true{
      UserDefaults.standart.set("true", forKey:"islogged")
    }
}   

并将其粘贴到AppDelegate

var window: UIWindow?


func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
    // Override point for customization after application launch.
    self.window = UIWindow(frame: UIScreen.main.bounds)
    let mainStoryboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
    var initialViewController: UIViewController

    if UserDefaults.standard.string(forKey: "islogged") == "true"//your condition if user is already logged in or not
    {
        // if already logged in then redirect to MainViewController

        initialViewController = mainStoryboard.instantiateViewController(withIdentifier: "HomeVC") as! UITabBarController // 'MainController' is the storyboard id of HomeViewController
    }
    else
    {
        //If not logged in then show LoginViewController
        initialViewController = mainStoryboard.instantiateViewController(withIdentifier: "LoginVC") as! SignInViewController // 'LoginController' is the storyboard id of LoginViewController

    }

    self.window?.rootViewController = initialViewController

    self.window?.makeKeyAndVisible()

    return true
}