回答編集履歴

2

回答を修正

2019/10/30 08:09

投稿

hameji
hameji

スコア1380

test CHANGED
@@ -1,36 +1,38 @@
1
- 上記二つの回答でピンときているかはわかりませんが、
1
+ ~~上記二つの回答でピンときているかはわかりませんが、~~
2
-
2
+
3
- サンプルコードを作って見ました。
3
+ ~~サンプルコードを作って見ました。~~
4
-
5
-
6
-
4
+
5
+
6
+
7
- 確かにアニメーションが必要なら、insertRows/deleteRowsですし、
7
+ ~~確かにアニメーションが必要なら、insertRows/deleteRowsですし、~~
8
-
8
+
9
- 不要であれば、reloadDataで更新をかければ解決すると思います。
9
+ ~~不要であれば、reloadDataで更新をかければ解決すると思います。~~
10
-
11
-
12
-
10
+
11
+
12
+
13
- 都合上、コードはつなげて書いてあります。
13
+ ~~都合上、コードはつなげて書いてあります。~~
14
-
14
+
15
- viewcontrollerにベタ張りすれば動くと思います。
15
+ ~~viewcontrollerにベタ張りすれば動くと思います。~~
16
-
17
-
18
-
16
+
17
+
18
+
19
- きれいに整えたいなら、コメントにも書きましたが、
19
+ ~~きれいに整えたいなら、コメントにも書きましたが、~~
20
-
20
+
21
- 別ファイルに分けることをお勧めします。
21
+ ~~別ファイルに分けることをお勧めします。~~
22
-
23
-
24
-
22
+
23
+
24
+
25
- また、tableviewのeditingに関してはあまり考えずに、そのまま使ったので、
25
+ ~~また、tableviewのeditingに関してはあまり考えずに、そのまま使ったので、~~
26
-
26
+
27
- すっきりとしてないかもしれません。
27
+ ~~すっきりとしてないかもしれません。~~
28
-
29
-
30
-
28
+
29
+
30
+
31
- 個人的にはstoryboardやxibファイルなどをうまく組み合わせるのが好きです。
31
+ ~~個人的にはstoryboardやxibファイルなどをうまく組み合わせるのが好きです。~~
32
-
32
+
33
- こういう場ではコードのみの方が、動くサンプルを渡せて便利ですけどね。
33
+ ~~こういう場ではコードのみの方が、動くサンプルを渡せて便利ですけどね。~~
34
+
35
+
34
36
 
35
37
 
36
38
 
@@ -341,3 +343,113 @@
341
343
  }
342
344
 
343
345
  ```
346
+
347
+
348
+
349
+ =========================================
350
+
351
+ 2019/10/30 更新
352
+
353
+
354
+
355
+ お恥ずかしながら、tyobigorouさんに指摘され気付いたんですが、
356
+
357
+ deleteRowによるindexPathとUIButtonのtagのズレ問題の解決をできてなかったので
358
+
359
+ 追記します。
360
+
361
+
362
+
363
+ アニメーションが必要ということで、insertRows/deleteRowsを使う方向で、
364
+
365
+ deleteRowsするとindexPathが減り、tagはそのままとなって確実にズレますね。
366
+
367
+
368
+
369
+ reloadData()が頭にあったので、上記のサンプルではそこを考慮できてなかったです。
370
+
371
+ cellForRowAt以外でdequeueReusableCellを呼び出すのはおすすめできないので、
372
+
373
+ tagを更新するのは、reloadData()で行う以外のいい方法は思いつかないです。
374
+
375
+
376
+
377
+ ~~tyobigorouさんも言ってますが、UIButtonのtagを使わず代わりに、~~
378
+
379
+ ~~普通にindexPathを利用して行うのがいいのではないでしょうか。~~
380
+
381
+
382
+
383
+ tagを使わない方法としては、
384
+
385
+ 以下に修正したコードを載せて見ます。
386
+
387
+ cellForRowatでのcell.button.tag = indexPath.rowは不要となります。
388
+
389
+ メインはcustomCellのボタンのfunctionとCustomCellDelegateの部分を変更しました。
390
+
391
+
392
+
393
+ ```Swift
394
+
395
+
396
+
397
+ extension ViewController: CustomCellDelegate {
398
+
399
+ func buttonPressed(word: String) {
400
+
401
+ if mode == 1 {
402
+
403
+ read(word: word)
404
+
405
+ }
406
+
407
+ }
408
+
409
+ }
410
+
411
+
412
+
413
+ // ~~~~間省略
414
+
415
+
416
+
417
+ @objc func buttonTapped() {
418
+
419
+ if let word = self.label.text {
420
+
421
+ self.delegate?.buttonPressed(word: word)
422
+
423
+ }
424
+
425
+ }
426
+
427
+ }
428
+
429
+
430
+
431
+ // MARK: -- ここから別ファイルCusotmCellDelegate.swiftなどが好ましい、import UIKitは不要
432
+
433
+
434
+
435
+ protocol CustomCellDelegate {
436
+
437
+ func buttonPressed(word: String)
438
+
439
+ }
440
+
441
+
442
+
443
+ ```
444
+
445
+
446
+
447
+ indexPathをうまく渡す方法は思いつかなかったので、
448
+
449
+ labelに表示されているstringを直接渡す方法にしてみました。
450
+
451
+
452
+
453
+ これなら、元データを変更せず(wordsでwordを削除せず)に、
454
+
455
+ 表示のみ変更(deleteRowのみした)場合にもきちんと該当の単語を読み上げてくれると思います。

1

修正

2019/10/30 08:09

投稿

hameji
hameji

スコア1380

test CHANGED
@@ -230,7 +230,13 @@
230
230
 
231
231
  // 上記は、CustomCellのメンバ変数delegate(CustomCellDelegate) を self(ViewController)で記述するという設定です。
232
232
 
233
- // すぐ下にextensionで書いてます。
233
+ // なので、CustomCellDelegateをすぐ下にextensionで書いてます。
234
+
235
+ // 要はボタンを押したというfuncをdelegateで渡すことにより、
236
+
237
+ // AVSpeechを各cellで作成せずに済んでますし,
238
+
239
+ // 直接、wordsにアクセスできてシンプルになってます。
234
240
 
235
241
  return cell
236
242