回答編集履歴

2

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

2020/07/15 11:13

投稿

TsukubaDepot
TsukubaDepot

スコア5086

test CHANGED
@@ -309,3 +309,159 @@
309
309
  }
310
310
 
311
311
  ```
312
+
313
+
314
+
315
+ #追記4
316
+
317
+
318
+
319
+ カスタムセル内にアウトレットがあっても難しく考える必要はありません。
320
+
321
+
322
+
323
+ ```Swift
324
+
325
+ import UIKit
326
+
327
+
328
+
329
+ class ViewController: UIViewController {
330
+
331
+
332
+
333
+ override func viewDidLoad() {
334
+
335
+ super.viewDidLoad()
336
+
337
+ // Do any additional setup after loading the view.
338
+
339
+ }
340
+
341
+
342
+
343
+ override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
344
+
345
+ let vc = segue.destination as! TableViewController
346
+
347
+ vc.item = "渡したい情報"
348
+
349
+ }
350
+
351
+
352
+
353
+ }
354
+
355
+
356
+
357
+ class TableViewController: UIViewController, UITableViewDataSource {
358
+
359
+
360
+
361
+ @IBOutlet weak var tableView: UITableView!
362
+
363
+ // MARK: 受け取りたい情報
364
+
365
+ var item: String!
366
+
367
+
368
+
369
+ // MARK: ここでは表示させない。
370
+
371
+ override func viewDidLoad() {
372
+
373
+ super.viewDidLoad()
374
+
375
+ // Do any additional setup after loading the view.
376
+
377
+ tableView.dataSource = self
378
+
379
+
380
+
381
+ // ここでは tableView を直接操作しない
382
+
383
+ }
384
+
385
+
386
+
387
+ func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
388
+
389
+ return 5
390
+
391
+ }
392
+
393
+
394
+
395
+ // MARK: セルを表示する段階で受け取った情報を表示させる
396
+
397
+ func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
398
+
399
+ //var cell: UITableViewCell!
400
+
401
+
402
+
403
+ if indexPath.row == 0 {
404
+
405
+ let cell = tableView.dequeueReusableCell(withIdentifier: "Cell1", for: indexPath) as! CustomTableViewCell
406
+
407
+ // 受け取った情報はここで表示させる
408
+
409
+ cell.textFieldInCustomCell.text = item
410
+
411
+
412
+
413
+ return cell
414
+
415
+ } else {
416
+
417
+ let cell = tableView.dequeueReusableCell(withIdentifier: "Cell2", for: indexPath)
418
+
419
+ cell.textLabel?.text = "それ以外のセル"
420
+
421
+
422
+
423
+ return cell
424
+
425
+ }
426
+
427
+ }
428
+
429
+ }
430
+
431
+
432
+
433
+ // MARK: Cell1 だけカスタムクラスで設定
434
+
435
+ // Cell1 に対応するカスタムクラスを CustomTableViewCell に設定
436
+
437
+ class CustomTableViewCell: UITableViewCell {
438
+
439
+ // カスタムセル内のアウトレット
440
+
441
+ @IBOutlet weak var textFieldInCustomCell: UITextField!
442
+
443
+
444
+
445
+ override func awakeFromNib() {
446
+
447
+ super.awakeFromNib()
448
+
449
+ // Initialization code
450
+
451
+ }
452
+
453
+
454
+
455
+ override func setSelected(_ selected: Bool, animated: Bool) {
456
+
457
+ super.setSelected(selected, animated: animated)
458
+
459
+
460
+
461
+ // Configure the view for the selected state
462
+
463
+ }
464
+
465
+ }
466
+
467
+ ```

1

サンプル追加

2020/07/15 11:12

投稿

TsukubaDepot
TsukubaDepot

スコア5086

test CHANGED
@@ -56,6 +56,8 @@
56
56
 
57
57
  かなりややこしい話ではありますが、原因と解決方法としてはこのような感じとなります。もしよくわからない点があればコメントいただければと思います。
58
58
 
59
+ (追伸:末尾に簡単なサンプルを挙げておきました)
60
+
59
61
 
60
62
 
61
63
  # 追伸:遷移先の UITableViewCell への値代入について
@@ -187,3 +189,123 @@
187
189
 
188
190
 
189
191
  なので、使い方に気をつけない限り、今回のようにオプショナル型へのアクセスと気づかないままアクセスし、思わぬ実行時エラーが発生すると理解していただければと思います。
192
+
193
+
194
+
195
+
196
+
197
+ #追記3:ごく簡単な検証用サンプル
198
+
199
+
200
+
201
+ 検証用のサンプルです。
202
+
203
+ 遷移先の `viewDidLoad()` でややこしいことをしなくても、`tableView(_:cellForRowAt:)`でセルを作る際にデータを表示させれば良いかと思います。
204
+
205
+
206
+
207
+ ```Swift
208
+
209
+ import UIKit
210
+
211
+
212
+
213
+ class ViewController: UIViewController {
214
+
215
+
216
+
217
+ override func viewDidLoad() {
218
+
219
+ super.viewDidLoad()
220
+
221
+ // Do any additional setup after loading the view.
222
+
223
+ }
224
+
225
+
226
+
227
+ override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
228
+
229
+ let vc = segue.destination as! TableViewController
230
+
231
+ vc.item = "渡したい情報"
232
+
233
+ }
234
+
235
+
236
+
237
+ }
238
+
239
+
240
+
241
+ class TableViewController: UIViewController, UITableViewDataSource {
242
+
243
+
244
+
245
+ @IBOutlet weak var tableView: UITableView!
246
+
247
+ // MARK: 受け取りたい情報
248
+
249
+ var item: String!
250
+
251
+
252
+
253
+ // MARK: ここでは表示させない。
254
+
255
+ override func viewDidLoad() {
256
+
257
+ super.viewDidLoad()
258
+
259
+ // Do any additional setup after loading the view.
260
+
261
+ tableView.dataSource = self
262
+
263
+
264
+
265
+ // ここでは tableView を直接操作しない
266
+
267
+ }
268
+
269
+
270
+
271
+ func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
272
+
273
+ return 5
274
+
275
+ }
276
+
277
+
278
+
279
+ // MARK: セルを表示する段階で受け取った情報を表示させる
280
+
281
+ func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
282
+
283
+ var cell: UITableViewCell!
284
+
285
+
286
+
287
+ if indexPath.row == 0 {
288
+
289
+ cell = tableView.dequeueReusableCell(withIdentifier: "Cell1", for: indexPath)
290
+
291
+ // 受け取った情報はここで表示させる
292
+
293
+ cell.textLabel?.text = item
294
+
295
+ } else {
296
+
297
+ cell = tableView.dequeueReusableCell(withIdentifier: "Cell2", for: indexPath)
298
+
299
+ cell.textLabel?.text = "それ以外のセル"
300
+
301
+ }
302
+
303
+
304
+
305
+ return cell
306
+
307
+ }
308
+
309
+ }
310
+
311
+ ```