回答編集履歴

3

@Stateのイニシャライザにおける初期値の設定についてを追記しました。

2023/03/30 14:25

投稿

退会済みユーザー
test CHANGED
@@ -144,3 +144,41 @@
144
144
  [frame(minWidth:idealWidth:maxWidth:minHeight:idealHeight:maxHeight:alignment:)](https://developer.apple.com/documentation/swiftui/view/frame(minwidth:idealwidth:maxwidth:minheight:idealheight:maxheight:alignment:))
145
145
 
146
146
 
147
+ ### 追記3
148
+
149
+ 解決済みですが、
150
+ コメントいただきましたので、
151
+ 同じ内容を回答欄にも記載しておきますね。
152
+
153
+ > textEditorTextへの文字の代入(とそれに伴う保存)だけが
154
+ > いただいた様にしても
155
+ > 〜としても できません
156
+
157
+ textEditorTextは@Stateのプロパティラッパー型で定義していますよね。
158
+ これをinit(イニシャライザ)で、初期値を設定するのは、ちょっと特殊な書き方をする必要があるみたいです。
159
+
160
+ `self.textEditorText` のように参照するのではなく、
161
+ `_textEditorText` のように参照するみたいです。
162
+ プロパティ名の先頭に「_」をつけたものです。
163
+
164
+ そして設定する値は
165
+ `item.text ?? ""` ではなく、
166
+ `State(initialValue: item.text ?? "")` のようになります。
167
+ State構造体のイニシャライザを呼び出す形です。
168
+ [init(initialValue:)](https://developer.apple.com/documentation/swiftui/state/init(initialvalue:))
169
+
170
+ まとめると、
171
+ 回答欄のコードにある通りですが、
172
+ 次のようになります。
173
+
174
+ ```swift
175
+ @State var textEditorText = ""
176
+ // 省略
177
+ init(item: Item) {
178
+ _textEditorText = State(initialValue: item.text ?? "")
179
+ }
180
+ ```
181
+
182
+ *これに関する公式のドキュメントを見たことがないのですが、stackoverflowなどで見て、そういうものだと思っています。
183
+ https://stackoverflow.com/questions/58758370/how-could-i-initialize-the-state-variable-in-the-init-function-in-swiftui
184
+

2

セルの中身について追記しました。

2023/03/30 04:29

投稿

退会済みユーザー
test CHANGED
@@ -114,8 +114,33 @@
114
114
  }()
115
115
  ```
116
116
 
117
+
117
- ## 追記
118
+ ### 追記
118
119
 
119
120
  「戻るときの保存」のコメントを受けてコードを修正しました。
120
121
  `// *** `のようなコメントが修正ポイントです。
121
122
 
123
+
124
+ ### 追記2
125
+
126
+ コメントありがとうございます。
127
+ もう不要かもしれませんが追記です。
128
+
129
+ > 「セルの中身」はtextsのvalueです
130
+
131
+ すみませんでした。理解したかもしれません。
132
+ itemにはtextとtextsの2つのプロパティがあって、
133
+ ContentViewのリスト(セル)に表示するのはtextなのだと思っていました。
134
+ (textはどこから設定するのだろう?とも思いました・・)
135
+ ここにはitem.textsが表示されるべきなのですね。
136
+
137
+ セルに表示される部分は、NavigationLinkのlabel引数で指定していますので、
138
+ 21行目の `Text(item.text ?? "")` は、
139
+ `Text(item.texts ?? "")` になるのかなと思います。
140
+ [init(destination:label:)](https://developer.apple.com/documentation/swiftui/navigationlink/init(destination:label:)-27n7s)
141
+
142
+ 長い文字列などはそのまま表示されてしまうと思いますので、
143
+ .frameモディファイアで、maxHeight,alignmentなどを指定してあげると良いのかなと思います。
144
+ [frame(minWidth:idealWidth:maxWidth:minHeight:idealHeight:maxHeight:alignment:)](https://developer.apple.com/documentation/swiftui/view/frame(minwidth:idealwidth:maxwidth:minheight:idealheight:maxheight:alignment:))
145
+
146
+

1

コードを修正しました。

2023/03/29 09:07

投稿

退会済みユーザー
test CHANGED
@@ -56,6 +56,8 @@
56
56
 
57
57
  struct AnotherView: View {
58
58
  @Environment(\.managedObjectContext) private var viewContext
59
+ // *** 独自のBackボタン実装時に戻るためのプロパティを追加しました。
60
+ @Environment(\.dismiss) private var dismiss
59
61
  @State var textEditorText = ""
60
62
  // itemを受け取るように追加しました。
61
63
  let item: Item
@@ -63,11 +65,19 @@
63
65
  TextEditor(text: $textEditorText)
64
66
  // 警告が出ていたためmaxWidth,maxHeightに変更しました。
65
67
  .frame(maxWidth: .infinity, maxHeight: .infinity)
68
+ // *** 独自のBackボタンを実装するため標準のBackボタンを非表示にしました。
69
+ .navigationBarBackButtonHidden(true)
66
70
  .toolbar {
67
71
  // 手元の環境だと.bottomBarではボタンが表示されなかったためナビゲーションバーに変更して確認しました。
68
72
  ToolbarItem(placement: .bottomBar) {
69
73
  Button(action: additem) {
70
74
  Image(systemName: "heart")
75
+ }
76
+ }
77
+ // *** 独自のBackボタンを追加しました。
78
+ ToolbarItem(placement: .navigationBarLeading) {
79
+ Button(action: back) {
80
+ Text("Back")
71
81
  }
72
82
  }
73
83
  }
@@ -77,7 +87,7 @@
77
87
  _textEditorText = State(initialValue: item.texts ?? "")
78
88
  self.item = item
79
89
  }
80
- func additem() {
90
+ private func additem() {
81
91
  withAnimation {
82
92
  // item.textsを変更して保存するように変更しました。
83
93
  item.texts = textEditorText
@@ -89,6 +99,11 @@
89
99
  }
90
100
  }
91
101
  }
102
+ // *** Backボタンのメソッドを追加しました。
103
+ private func back() {
104
+ additem()
105
+ dismiss()
106
+ }
92
107
  }
93
108
 
94
109
  private let itemFormatter: DateFormatter = {
@@ -99,3 +114,8 @@
99
114
  }()
100
115
  ```
101
116
 
117
+ ## 追記
118
+
119
+ 「戻るときの保存」のコメントを受けてコードを修正しました。
120
+ `// *** `のようなコメントが修正ポイントです。
121
+