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

回答編集履歴

2

カスタムクラスの例を追記

2020/07/15 11:13

投稿

TsukubaDepot
TsukubaDepot

スコア5086

answer CHANGED
@@ -153,4 +153,82 @@
153
153
  return cell
154
154
  }
155
155
  }
156
+ ```
157
+
158
+ #追記4
159
+
160
+ カスタムセル内にアウトレットがあっても難しく考える必要はありません。
161
+
162
+ ```Swift
163
+ import UIKit
164
+
165
+ class ViewController: UIViewController {
166
+
167
+ override func viewDidLoad() {
168
+ super.viewDidLoad()
169
+ // Do any additional setup after loading the view.
170
+ }
171
+
172
+ override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
173
+ let vc = segue.destination as! TableViewController
174
+ vc.item = "渡したい情報"
175
+ }
176
+
177
+ }
178
+
179
+ class TableViewController: UIViewController, UITableViewDataSource {
180
+
181
+ @IBOutlet weak var tableView: UITableView!
182
+ // MARK: 受け取りたい情報
183
+ var item: String!
184
+
185
+ // MARK: ここでは表示させない。
186
+ override func viewDidLoad() {
187
+ super.viewDidLoad()
188
+ // Do any additional setup after loading the view.
189
+ tableView.dataSource = self
190
+
191
+ // ここでは tableView を直接操作しない
192
+ }
193
+
194
+ func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
195
+ return 5
196
+ }
197
+
198
+ // MARK: セルを表示する段階で受け取った情報を表示させる
199
+ func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
200
+ //var cell: UITableViewCell!
201
+
202
+ if indexPath.row == 0 {
203
+ let cell = tableView.dequeueReusableCell(withIdentifier: "Cell1", for: indexPath) as! CustomTableViewCell
204
+ // 受け取った情報はここで表示させる
205
+ cell.textFieldInCustomCell.text = item
206
+
207
+ return cell
208
+ } else {
209
+ let cell = tableView.dequeueReusableCell(withIdentifier: "Cell2", for: indexPath)
210
+ cell.textLabel?.text = "それ以外のセル"
211
+
212
+ return cell
213
+ }
214
+ }
215
+ }
216
+
217
+ // MARK: Cell1 だけカスタムクラスで設定
218
+ // Cell1 に対応するカスタムクラスを CustomTableViewCell に設定
219
+ class CustomTableViewCell: UITableViewCell {
220
+ // カスタムセル内のアウトレット
221
+ @IBOutlet weak var textFieldInCustomCell: UITextField!
222
+
223
+ override func awakeFromNib() {
224
+ super.awakeFromNib()
225
+ // Initialization code
226
+ }
227
+
228
+ override func setSelected(_ selected: Bool, animated: Bool) {
229
+ super.setSelected(selected, animated: animated)
230
+
231
+ // Configure the view for the selected state
232
+ }
233
+ }
156
234
  ```

1

サンプル追加

2020/07/15 11:12

投稿

TsukubaDepot
TsukubaDepot

スコア5086

answer CHANGED
@@ -27,6 +27,7 @@
27
27
  なので、一旦何らかのプロパティを準備しておき、一旦それに代入し、遷移先で `viewDidLoad()`が実行される段階で UI 部品への値の代入を行う、とう手順を踏まなければなりません。
28
28
 
29
29
  かなりややこしい話ではありますが、原因と解決方法としてはこのような感じとなります。もしよくわからない点があればコメントいただければと思います。
30
+ (追伸:末尾に簡単なサンプルを挙げておきました)
30
31
 
31
32
  # 追伸:遷移先の UITableViewCell への値代入について
32
33
 
@@ -92,4 +93,64 @@
92
93
 
93
94
  しかし、必ず値を代入することを**「プログラマが」**責任をもつオプショナル型については、特例で`?`を付けなくてもアクセスできるようになっています。
94
95
 
95
- なので、使い方に気をつけない限り、今回のようにオプショナル型へのアクセスと気づかないままアクセスし、思わぬ実行時エラーが発生すると理解していただければと思います。
96
+ なので、使い方に気をつけない限り、今回のようにオプショナル型へのアクセスと気づかないままアクセスし、思わぬ実行時エラーが発生すると理解していただければと思います。
97
+
98
+
99
+ #追記3:ごく簡単な検証用サンプル
100
+
101
+ 検証用のサンプルです。
102
+ 遷移先の `viewDidLoad()` でややこしいことをしなくても、`tableView(_:cellForRowAt:)`でセルを作る際にデータを表示させれば良いかと思います。
103
+
104
+ ```Swift
105
+ import UIKit
106
+
107
+ class ViewController: UIViewController {
108
+
109
+ override func viewDidLoad() {
110
+ super.viewDidLoad()
111
+ // Do any additional setup after loading the view.
112
+ }
113
+
114
+ override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
115
+ let vc = segue.destination as! TableViewController
116
+ vc.item = "渡したい情報"
117
+ }
118
+
119
+ }
120
+
121
+ class TableViewController: UIViewController, UITableViewDataSource {
122
+
123
+ @IBOutlet weak var tableView: UITableView!
124
+ // MARK: 受け取りたい情報
125
+ var item: String!
126
+
127
+ // MARK: ここでは表示させない。
128
+ override func viewDidLoad() {
129
+ super.viewDidLoad()
130
+ // Do any additional setup after loading the view.
131
+ tableView.dataSource = self
132
+
133
+ // ここでは tableView を直接操作しない
134
+ }
135
+
136
+ func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
137
+ return 5
138
+ }
139
+
140
+ // MARK: セルを表示する段階で受け取った情報を表示させる
141
+ func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
142
+ var cell: UITableViewCell!
143
+
144
+ if indexPath.row == 0 {
145
+ cell = tableView.dequeueReusableCell(withIdentifier: "Cell1", for: indexPath)
146
+ // 受け取った情報はここで表示させる
147
+ cell.textLabel?.text = item
148
+ } else {
149
+ cell = tableView.dequeueReusableCell(withIdentifier: "Cell2", for: indexPath)
150
+ cell.textLabel?.text = "それ以外のセル"
151
+ }
152
+
153
+ return cell
154
+ }
155
+ }
156
+ ```