teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

1

UserDefaultsの書き方をシンプルにしました。プロパティラッパー等は用いていません。

2020/05/28 11:21

投稿

Hyperbolic4183
Hyperbolic4183

スコア17

title CHANGED
File without changes
body CHANGED
@@ -3,23 +3,25 @@
3
3
  画像のように選択した色を保存するとRGBの3つの値がObservableObjectクラスのプロパティである配列`@Published var rgbArray = [[Int]]()`に保存され、別のビューでリスト表示されるようになっています。
4
4
  困っていることはアプリの履歴を消したり、本体を再起動すると配列に格納されていた要素が消えてしまうことです。
5
5
  ##試みている解決方法
6
+ UserDefaultsによって永続化を試みています。
7
+ ```
8
+ UserDefaults.standard.set(self.favoriteArray.rgbArray,forKey: "stored")
9
+ self.favoriteArray.rgbArray.append([self.r,self.g,self.b])
10
+ ```
11
+ によってrgbArrayにUseDefaultsを用いています。
12
+ リストを表示するビューでは
13
+ ```
6
- ググった結果、UserDefaultsを用いて本体に記録すればいいらしいのでボタンを配置するビューに`let userdefaluts = UserDefaults.standard`を定義し、ボタンを押した時に行われる操作を
14
+ let userdefaultRgbArray: [[Int]] = UserDefaults.standard.array(forKey: "stored") as! [[Int]]
15
+ var body: some View {
7
16
 
8
- `self.favoriteArray.rgbArray.append([self.r,self.g,self.b])`から
9
- `self.userdefaluts.set(self.favoriteArray.rgbArray, forKey: "udrgbArray")`にしました。
10
-
11
- ここで`favoriteArray`は`@EnvironmentObject var favoriteArray: ObservedRGB`です。
12
-
13
-
14
- リストで並べるために、`var storedArray:[[Int]] = UserDefaults.standard.array(forKey: "udrgbArray") as! [[Int]]`でUserDefaultsで保存した配列を呼び出し
15
- ```List {
17
+ List {
16
- ForEach(0..<self.storedArray.count) { item in
18
+ ForEach(0..<self.userdefaultRgbArray.count) { item in
19
+
17
- ListRow(rValue: self.storedArray[item][0], gValue: self.storedArray[item][1], bValue: self.storedArray[item][2])
20
+ ListRow(rValue: self.userdefaultRgbArray[item][0], gValue: self.userdefaultRgbArray[item][1], bValue: self.userdefaultRgbArray[item][2])
18
21
  }
22
+ }
19
23
  ```
20
- のように配列の数だけリスト表示しています。
24
+ のようにして配列の要素の数だけリストが増えるようになっています。
21
- ここで`ListRow`は3つのInt型を引数に持ちそれを背景色にもつビューです。
22
-
23
25
  ##起きているエラー
24
26
  Can't preview in this fileと表示され
25
27
  `| Error Domain=com.apple.dt.ultraviolet.service Code=12 "Rendering service was interrupted" UserInfo={NSLocalizedDescription=Rendering service was interrupted}`
@@ -32,13 +34,17 @@
32
34
  ```ColorDetail
33
35
  import SwiftUI
34
36
 
37
+
35
38
  struct ColorDetail: View {
36
39
  var r:Int
37
40
  var g:Int
38
41
  var b:Int
39
42
  @EnvironmentObject var favoriteArray: ObservedRGB
43
+
40
- let userdefaluts = UserDefaults.standard
44
+ var userDefaults = UserDefaults.standard
45
+
41
46
  var body: some View {
47
+
42
48
  GeometryReader{ bodyView in
43
49
  VStack {
44
50
  Text("")
@@ -47,9 +53,8 @@
47
53
  Text("R値は(self.r)G値は(self.g)B値は(self.b)")
48
54
  Button(action: {
49
55
  print("tapped")
50
-
56
+ UserDefaults.standard.set(self.favoriteArray.rgbArray,forKey: "stored") //rgbArray永続的に保存する
51
- //self.favoriteArray.rgbArray.append([self.r,self.g,self.b])
57
+ self.favoriteArray.rgbArray.append([self.r,self.g,self.b])
52
- self.userdefaluts.set(self.favoriteArray.rgbArray, forKey: "udrgbArray")
53
58
  }){
54
59
  Text("保存する")
55
60
  }
@@ -85,14 +90,17 @@
85
90
  ```
86
91
  リストに並べられるビュー
87
92
  ```ListRow
88
- mport SwiftUI
89
93
 
94
+ import SwiftUI
95
+
90
96
  struct ListRow: View {
91
- @EnvironmentObject var favoriteArray: ObservedRGB
97
+
92
98
  var rValue: Int
93
99
  var gValue: Int
94
100
  var bValue: Int
95
- var storedArray = UserDefaults.standard.array(forKey: "udrgbArray")
101
+
102
+
103
+
96
104
  var body: some View {
97
105
 
98
106
  Text("(String(rValue, radix: 16))(String(gValue, radix: 16))(String(bValue, radix: 16))")
@@ -105,7 +113,7 @@
105
113
  struct ListRow_Previews: PreviewProvider {
106
114
  static let favoriteArray = ObservedRGB()
107
115
  static var previews: some View {
108
- ListRow(rValue: 0, gValue: 0, bValue: 0).environmentObject(favoriteArray)
116
+ ListRow(rValue: 1, gValue: 0, bValue: 0)
109
117
  }
110
118
  }
111
119
  ```
@@ -115,16 +123,20 @@
115
123
 
116
124
  struct MainList: View {
117
125
  @EnvironmentObject var favoriteArray: ObservedRGB
118
- var storedArray:[[Int]] = UserDefaults.standard.array(forKey: "udrgbArray") as! [[Int]]
126
+ let userdefaultRgbArray: [[Int]] = UserDefaults.standard.array(forKey: "stored") as! [[Int]]
119
127
  var body: some View {
120
128
 
121
129
  List {
122
- ForEach(0..<self.storedArray.count) { item in
130
+ ForEach(0..<self.userdefaultRgbArray.count) { item in
123
131
 
124
- ListRow(rValue: self.storedArray[item][0], gValue: self.storedArray[item][1], bValue: self.storedArray[item][2])
132
+ ListRow(rValue: self.userdefaultRgbArray[item][0], gValue: self.userdefaultRgbArray[item][1], bValue: self.userdefaultRgbArray[item][2])
125
133
  }
126
134
  }
127
-
135
+
136
+
137
+
138
+
139
+
128
140
  }
129
141
  }
130
142