ozk-dev
@ozk-dev

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

SwiftUIでUserDefaultsの読み書きについて

Q&A

Closed

解決したいこと

SwiftUIでログインアプリを作成しています。
メイン画面を表示しデータの確認・修正を行います。
メイン画面を開く際にログインしていない場合(IDがない場合)、ログイン画面を開きます。
IDは、UserDefaultsより参照して切り替えを考えています。

問題点
ログイン画面にて、「ログイン」ボタンタップ後に UserDefaultsへ保存し、メイン画面へ
メイン画面で、UserDefaultsからIDを取り出し、情報表示
となるはずなのですが、メイン画面でUserDefaultsでIDを取得するとデフォルト値に戻っています。

該当するソースコード

struct LoginView: View {

    @State var inputEmail: String = ""
    @State var inputPassword: String = ""
    @State var isActiveSubView = false

    var body: some View {
        VStack(alignment: .center) {

            NavigationLink(destination: MainView(),isActive: $isActiveSubView) {
                EmptyView()
            }
            Button(action: {
                loginCheck()
            },
            label: {
                Text("Login")
                    .fontWeight(.medium)
                    .frame(minWidth: 160)
                    .foregroundColor(.white)
                    .padding(12)
                    .background(Color.accentColor)
                    .cornerRadius(8)
            })
        }
    }
    func loginCheck() {

        print(inputEmail)
        print(inputPassword)
        if(inputEmail != nil){

        }
        if(inputPassword != nil){

        }
        let mainAPIHost: String = URL
        var request = URLRequest(url: URL(string: mainAPIHost)!)
        request.httpMethod = "GET"
        var l_mId: Int = 0
        var l_rKy: String = ""
        var l_aKy: String = ""
        let task = URLSession.shared.dataTask(with: request) { data, response, error in
            guard let jsonData = data else { return }

            do {
                //var name: memberInfo
                let vitals = try JSONDecoder().decode(loginData.self, from: jsonData)
                print(vitals)
                loginTbl = vitals
                loginTbl.forEach({(data) in
                    ID = data.member_id
                    AccKey = data.rekey
                    ResKey = data.acKey
                })
                if (l_mId > 0){
                    UserDefaults.standard.set(l_mId.description, forKey: "ADMIN_ID")
                    UserDefaults.standard.set(l_rKy, forKey: "ADMIN_RKEY")
                    UserDefaults.standard.set(l_aKy, forKey: "ADMIN_AKEY")

                    isActiveSubView = true
                }
            } catch {

            }
        }
    }


struct MainView: View {
    @State private var nameTbl = [nameInfo]()
    @State var isOnSendUserData = false
    @State var Id: String = UserDefaults.standard.string(forKey: "ADMIN_ID") ?? "0"
    var body: some View {
        if (Id == "0"){
            LoginView()
        }else{
0

1Answer

データベースに保存する処理が実行されているかどうか、されていたら保存している値の内容が何なのか、を確認したほうが良いと思います。

0Like

Comments

  1. @ozk-dev

    Questioner

    ありがとう御座います。
    @State var Id: String = UserDefaults.standard.string(forKey: "ADMIN_ID") ?? "0"
    の位置を変更する事で解決しました。

Your answer might help someone💌