回答編集履歴

3

誤字を修正

2020/07/05 23:53

投稿

TsukubaDepot
TsukubaDepot

スコア5086

test CHANGED
@@ -16,7 +16,7 @@
16
16
 
17
17
 
18
18
 
19
- この方法で、答や問題文に関するデータを次の画面に渡してあげる方法が一つです。つまり、問題出題画面であらかじめ回答も取得しておき、答を次の画面に渡してあげるという方法です。
19
+ この方法で、答や問題文に関するデータを次の画面に渡してあげる方法が一つです。つまり、問題出題画面であらかじめ回答も取得しておき、答を次の画面に渡してあげるという方法です。
20
20
 
21
21
 
22
22
 
@@ -34,7 +34,7 @@
34
34
 
35
35
  ---
36
36
 
37
- 問題、答を一つのセットとして遷移先に渡すサンプルです。NavigationController を使って遷移しているようなので、元の画面に戻ってきたら別の問題が出るように修正してあります(詳しくはコメントを参照していただけますでしょうか)。
37
+ 問題、答を一つのセットとして遷移先に渡すサンプルです。NavigationController を使って遷移しているようなので、元の画面に戻ってきたら別の問題が出るように修正してあります(詳しくはコメントを参照していただけますでしょうか)。
38
38
 
39
39
 
40
40
 
@@ -160,7 +160,7 @@
160
160
 
161
161
  if let answerVC = segue.destination as? AnswerViewController {
162
162
 
163
- // 設問、答両方を渡しているが、答えだけでもいい
163
+ // 設問、答両方を渡しているが、答えだけでもいい
164
164
 
165
165
  answerVC.question = selectedQuestion
166
166
 
@@ -198,7 +198,7 @@
198
198
 
199
199
 
200
200
 
201
- // MARK: 答を表示する
201
+ // MARK: 答を表示する
202
202
 
203
203
  answerTextView.text = question.answer
204
204
 

2

サンプル追加

2020/07/05 23:53

投稿

TsukubaDepot
TsukubaDepot

スコア5086

test CHANGED
@@ -29,3 +29,181 @@
29
29
 
30
30
 
31
31
  ただ、いずれの方法でも値渡しが必要なので、それについては理解を深める必要があるかと思います。
32
+
33
+
34
+
35
+ ---
36
+
37
+ 問題、回答を一つのセットとして遷移先に渡すサンプルです。NavigationController を使って遷移しているようなので、元の画面に戻ってきたら別の問題が出るように修正してあります(詳しくはコメントを参照していただけますでしょうか)。
38
+
39
+
40
+
41
+ 簡単に確認するためRealmデータベースではなくクラスの配列にしていますが、基本的な考え方は同じですので、適宜読み替えてみてくださいますでしょうか。
42
+
43
+
44
+
45
+ あと、過去の質問で tyobigorou さんも指摘されていますが、変数名は小文字で始めるなど、Swiftの命名規則に従った方が可読性があがりますので、少しづつ修正されると良いかと思います。
46
+
47
+
48
+
49
+ ```Swift
50
+
51
+ import UIKit
52
+
53
+
54
+
55
+ // MARK: この程度であれば構造体の方が初期化も楽だが、Realm で使うことを考えて class で宣言
56
+
57
+ class Question {
58
+
59
+ var problem: String!
60
+
61
+ var answer: String!
62
+
63
+
64
+
65
+ init(problem: String, answer: String) {
66
+
67
+ self.problem = problem
68
+
69
+ self.answer = answer
70
+
71
+ }
72
+
73
+ }
74
+
75
+
76
+
77
+ class ViewController: UIViewController {
78
+
79
+ // MARK: 変数(プロパティ)名は小文字で始める
80
+
81
+ @IBOutlet weak var showTextView: UITextView!
82
+
83
+
84
+
85
+ // MARK: Realm データベースの代わり
86
+
87
+ var questions = [
88
+
89
+ Question(problem: "Appleの意味は?", answer: "りんご!"),
90
+
91
+ Question(problem: "Busの意味は?", answer: "バス!"),
92
+
93
+ Question(problem: "Carの意味は?", answer: "車!"),
94
+
95
+ Question(problem: "Doctorの意味は?", answer: "お医者さん!"),
96
+
97
+ Question(problem: "Emacsの意味は?", answer: "Editing MACroS とか E with MACroS")
98
+
99
+ ]
100
+
101
+
102
+
103
+ // MARK: randomElement() で選択した問題を入れる変数。
104
+
105
+ // クラス内で参照できるようにトップレベルで宣言する。
106
+
107
+ var selectedQuestion: Question!
108
+
109
+
110
+
111
+ // MARK: viewDidLoad() はビュー読み込み時しか実行されない
112
+
113
+ override func viewDidLoad() {
114
+
115
+ super.viewDidLoad()
116
+
117
+ }
118
+
119
+
120
+
121
+ // MARK: 出題する問題は viewWillAppear() で選択し、showTextView に表示させる
122
+
123
+ // ここで表示させれば Navigation Controller で戻ってきた際に別の問題を表示させることができる
124
+
125
+ override func viewWillAppear(_ animated: Bool) {
126
+
127
+ super.viewWillAppear(animated)
128
+
129
+
130
+
131
+ // selectedQuestion() にランダムに選んだ問題の最初の要素を入れる
132
+
133
+ // Realm でアクセスする際もここで問題を取り出す
134
+
135
+ selectedQuestion = questions.randomElement()!
136
+
137
+
138
+
139
+ // 問題だけを表示
140
+
141
+ showTextView.text = selectedQuestion.problem
142
+
143
+ }
144
+
145
+
146
+
147
+ // MARK: ボタンを押したら Segue を実行
148
+
149
+ @IBAction func answerButton(_ sender: Any) {
150
+
151
+ performSegue(withIdentifier: "toAnswer", sender: nil)
152
+
153
+ }
154
+
155
+
156
+
157
+ // MARK: 遷移先にある question という変数に選択した問題を入れる
158
+
159
+ override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
160
+
161
+ if let answerVC = segue.destination as? AnswerViewController {
162
+
163
+ // 設問、答え両方を渡しているが、答えだけでもいい
164
+
165
+ answerVC.question = selectedQuestion
166
+
167
+ }
168
+
169
+ }
170
+
171
+ }
172
+
173
+ ```
174
+
175
+ 遷移先
176
+
177
+ ```Swift
178
+
179
+ import UIKit
180
+
181
+
182
+
183
+ class AnswerViewController: UIViewController {
184
+
185
+ @IBOutlet weak var answerTextView: UITextView!
186
+
187
+
188
+
189
+ // MARK: 前の画面から受け取ったデータ
190
+
191
+ var question: Question!
192
+
193
+
194
+
195
+ override func viewDidLoad() {
196
+
197
+ super.viewDidLoad()
198
+
199
+
200
+
201
+ // MARK: 答えを表示する
202
+
203
+ answerTextView.text = question.answer
204
+
205
+ }
206
+
207
+ }
208
+
209
+ ```

1

追記

2020/07/04 00:58

投稿

TsukubaDepot
TsukubaDepot

スコア5086

test CHANGED
@@ -16,7 +16,7 @@
16
16
 
17
17
 
18
18
 
19
- この方法で、回答や問題文に関するデータを次の画面に渡してあげる方法が一つです。
19
+ この方法で、回答や問題文に関するデータを次の画面に渡してあげる方法が一つです。つまり、問題出題画面であらかじめ回答も取得しておき、回答を次の画面に渡してあげるという方法です。
20
20
 
21
21
 
22
22
 
@@ -24,7 +24,7 @@
24
24
 
25
25
 
26
26
 
27
- ただし、の方法だとのマイグレーションを行う必要があるかと思いますが、ID を付与することでデータが一意になるので検索という観点から考えると便利になります。
27
+ ただし、後者の方法だと新しいフィルドが追加されるため、オブジェクトのマイグレーション必要かと思いますが、ID を付与することでデータが一意になるので検索という観点から考えると便利になります。
28
28
 
29
29
 
30
30