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

回答編集履歴

5

さらについき

2019/10/02 06:15

投稿

takabosoft
takabosoft

スコア8356

answer CHANGED
@@ -6,8 +6,14 @@
6
6
 
7
7
  メンバー変数に合計値を持っておいて、セルのタップによってその合計値を足したり減らしたりするのは、整数だったらまだいいですが、小数などでは誤差がでるので、辞めたほうがいいです。毎回合計値を求める方がたぶん安全です。
8
8
 
9
- また、おそらくセルの数を増やしてスクロールすると、チェックマークとセルの選択が一致しない可能性がありますので、`func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell`で選択状態を見てチェックマークの更新行ってくだ
9
+ また、おそらくセルの数を増やしてスクロールすると、チェックマークとセルの選択が一致しない可能性がありますので、以下ようなコードで選択状態チェックマークを同期せる必要がありそうです
10
10
 
11
+ ```swift
12
+ func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
13
+ cell.accessoryType = cell.isSelected ? .checkmark : .none
14
+ }
15
+ ```
16
+
11
17
  ちなみにアクセサリータイプで自分でチェックマークを設定しなくても、標準機能としてチェックマークを出すこともできます。
12
18
  参考:
13
19
  [How to select multiple rows in UITableView in edit mode?](https://stackoverflow.com/questions/33970807/how-to-select-multiple-rows-in-uitableview-in-edit-mode)

4

改善

2019/10/02 06:15

投稿

takabosoft
takabosoft

スコア8356

answer CHANGED
@@ -1,12 +1,17 @@
1
1
  UITableView自体の複数選択機能をオンにしているんですよね?
2
2
 
3
3
  だったら
4
- UITableViewのindexPathsForSelectedRowsを使えば、選択しているセルのIndexPath一覧が取れますので、
5
- https://developer.apple.com/documentation/uikit/uitableview/1614864-indexpathsforselectedrows
4
+ UITableViewの[indexPathsForSelectedRows](https://developer.apple.com/documentation/uikit/uitableview/1614864-indexpathsforselectedrows)を使えば、選択しているセルのIndexPath一覧が取れますので、
6
- 選択状態が変わったタイミングで、毎回合計値を求めれそれ終わりです。
5
+ 選択状態が変わったタイミングで、毎回合計値を算出しなおせOKです。
7
6
 
8
- なお、メンバー変数に合計値を持っておいて、セルのタップによってその合計値を足したり減らしたりするのは、整数だったらまだいいですが、小数などでは誤差がでるので、辞めたほうがいいです。毎回合計値を求める方がたぶん安全です。
7
+ メンバー変数に合計値を持っておいて、セルのタップによってその合計値を足したり減らしたりするのは、整数だったらまだいいですが、小数などでは誤差がでるので、辞めたほうがいいです。毎回合計値を求める方がたぶん安全です。
9
8
 
9
+ また、おそらくセルの数を増やしてスクロールすると、チェックマークとセルの選択が一致しない可能性がありますので、`func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell`の中で選択状態を見てチェックマークの更新を行ってください。
10
+
11
+ ちなみにアクセサリータイプで自分でチェックマークを設定しなくても、標準機能としてチェックマークを出すこともできます。
12
+ 参考:
13
+ [How to select multiple rows in UITableView in edit mode?](https://stackoverflow.com/questions/33970807/how-to-select-multiple-rows-in-uitableview-in-edit-mode)
14
+
10
15
  ----
11
16
 
12
17
  以下、本題とは関係ありませんが、一つの情報は構造体やクラスにまとめるべきです。

3

もともと複数選択モードを利用しているようなので改善

2019/10/02 05:53

投稿

takabosoft
takabosoft

スコア8356

answer CHANGED
@@ -1,23 +1,14 @@
1
- UITableViewにももともと複数選択ができる機能がありまして
1
+ UITableView自体の複数選択機能をオンにしているんですよね?
2
- そちらを使えば、UITableView側が選択したセルの一覧を覚えているので、あとから選択されているセル一覧を取得するのは容易だったりします。
3
2
 
4
- 参考:
3
+ だったら
4
+ UITableViewのindexPathsForSelectedRowsを使えば、選択しているセルのIndexPath一覧が取れますので、
5
- https://stackoverflow.com/questions/33970807/how-to-select-multiple-rows-in-uitableview-in-edit-mode
5
+ https://developer.apple.com/documentation/uikit/uitableview/1614864-indexpathsforselectedrows
6
- (左に青丸のチェックマーク付きま
6
+ 選択状態変わったタイミングで、毎回合計値を求めればそれで終わりで
7
7
 
8
- 今回は質問者さんはセルのアクセサリーとしチェックマーク表示ていますので、
8
+ なお、メンバー変数に合計値を持っておいて、セルのタによっその合計値たり減らしたりするのは、整数だったらだいいでが、小数などでは誤差がでるので、辞めたほうがいいです。毎回合計値を求める方がたぶん安全です。
9
- この方針で行く場合
10
9
 
11
- 0. チェック状態をbool配列かSet型で自分で管理する(=メンバー変数にチェック状態をなんとかして保持する)
12
- 0. `func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell`でセルを生成する際にチェック状態を管理しているメンバー変数をもとにCellへチェック状態を復元
13
- 0. セルタップでチェック状態を自分で更新(Cellとメンバー変数両方)
10
+ ----
14
11
 
15
- としてください。
16
-
17
- あとは、3のタイミングで、「どのセルが選択されているか?」はメンバー変数を見ればわかりますし、「選択されているセルの価格がいくらか?」もself.priceArrayを見ればわかりますので、合計を求めて表示するだけです。
18
-
19
- なお、メンバー変数に合計値を持っておいて、セルのタップによってその合計値を足したり減らしたりするのは、整数だったらまだいいですが、小数などでは誤差がでるので、辞めたほうがいいです。毎回合計値を求める方がたぶん安全です。
20
-
21
12
  以下、本題とは関係ありませんが、一つの情報は構造体やクラスにまとめるべきです。
22
13
  例えば「人」の情報として名前と年齢があり、複数人の情報を保持したい場合、
23
14
  質問者さんは

2

1

2019/10/02 05:48

投稿

takabosoft
takabosoft

スコア8356

answer CHANGED
@@ -8,7 +8,7 @@
8
8
  今回は質問者さんはセルのアクセサリータイプとしてチェックマークを表示していますので、
9
9
  この方針で行く場合
10
10
 
11
- 0. チェック状態をbool配列かSet型で自分で管理する
11
+ 0. チェック状態をbool配列かSet型で自分で管理する(=メンバー変数にチェック状態をなんとかして保持する)
12
12
  0. `func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell`でセルを生成する際にチェック状態を管理しているメンバー変数をもとにCellへチェック状態を復元
13
13
  0. セルタップでチェック状態を自分で更新(Cellとメンバー変数両方)
14
14
 

1

0

2019/10/02 05:37

投稿

takabosoft
takabosoft

スコア8356

answer CHANGED
@@ -5,10 +5,10 @@
5
5
  https://stackoverflow.com/questions/33970807/how-to-select-multiple-rows-in-uitableview-in-edit-mode
6
6
  (左に青丸のチェックマークが付きます)
7
7
 
8
- ただ、今回は質問者さんはセルのアクセサリータイプとしてチェックマークを表示しています
8
+ 今回は質問者さんはセルのアクセサリータイプとしてチェックマークを表示していますので
9
9
  この方針で行く場合
10
10
 
11
- 0. チェック状態を配列かSet型で自分で管理する
11
+ 0. チェック状態をbool配列かSet型で自分で管理する
12
12
  0. `func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell`でセルを生成する際にチェック状態を管理しているメンバー変数をもとにCellへチェック状態を復元
13
13
  0. セルタップでチェック状態を自分で更新(Cellとメンバー変数両方)
14
14