質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

1回答

2547閲覧

SwiftUI、@State変数のタスク終了後の保持の仕方

tmtm_201

総合スコア6

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

1クリップ

投稿2020/02/03 14:57

###前提
Swift初学者です。Swift、xcodeで時間割アプリを作成しています。
現在は全てのコマにおいて共通の変数で表示しているため、同じもの(講義名など)が表示されています。

###実現したいこと
TextFieldの@State変数の文字列(講義名など)をアプリ終了後も保持させたいです。

発生している問題・エラーメッセージ

エラーは発生しないが、TextFieldの@State変数をUserDefaults.standard.setで保持することができない。
シミュレーター上で変更、タスクキル後再びアプリを開くと最初に定義しているほげほげ学に戻ってしまっている。

該当のソースコード

import SwiftUI
import Foundation

struct ContentView: View {
@State var name: String = "ほげほげ学"
@State var room: String = "1-2-3"

var DotW = ["月","火","水","木","金"] var i = 0 var body: some View { NavigationView { VStack{ Text("時間割") HStack{ VStack{ Text("") ForEach(1..<6) { Text("($0)") Spacer() } } ForEach(DotW, id: .self) { choice in VStack { Text(choice) ForEach(/*@START_MENU_TOKEN@*/0 ..< 5/*@END_MENU_TOKEN@*/) { item in HogeView(name: self.$name,room: self.$room) Spacer() } } .onAppear { guard let userdefaultText = UserDefaults.standard.value(forKey: "name") as? String else { return } self.name = userdefaultText } } } } } }

}

struct HogeView: View {
@Binding var name: String
@Binding var room: String
var body: some View {
NavigationLink(destination: HogeSecondView(name: self.$name,room: self.$room)) {
VStack{
Text("(name)")
// Spacer()
Text("(room)")
// Spacer()
}
}
}
}

struct HogeSecondView: View {
@Binding var name: String
@Binding var room: String
var body: some View {
VStack{
HStack{
Text("講義名")
TextField("",text: $name, onCommit: {
UserDefaults.standard.set(self.name, forKey: "name")
})
}
HStack{
Text("講義室")
TextField("",text: $room)
}
}
}
}

struct ContentView_Previews : PreviewProvider {
static var previews: some View {
ContentView()
}
}

試したこと

.onAppearの場所の変更

補足情報(FW/ツールのバージョンなど)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

方向性を変えてシングルビューにした結果上手くいくようになりました。

投稿2020/02/04 13:11

tmtm_201

総合スコア6

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問