質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
TableView

TableView(UITableView)とは、リスト形式で表示するコントロールで、ほとんどのアプリに使用されています。画面を「行」に分けて管理し、一般的には各行をタップした際に詳細画面に移動します。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

1回答

1277閲覧

テーブルビューのセルを選択して、セクションごとの合計金額を次の画面で表示させたい。

narunaru

総合スコア3

TableView

TableView(UITableView)とは、リスト形式で表示するコントロールで、ほとんどのアプリに使用されています。画面を「行」に分けて管理し、一般的には各行をタップした際に詳細画面に移動します。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2019/09/04 11:58

編集2019/09/06 00:24

前提・実現したいこと

テーブルビューのセルを選択して、セクションごとの合計金額を次の画面で表示させたい。

現在、カテゴリー別に商品の合計金額を計算するアプリを作っています。商品を画面に表示させる事と、セルを複数選択することはできたのですが、セルを選択したときに値段を取得する方法が全くわかりませんでした。わかりやすく説明していただけるとありがたいです。お願いいたします。

発生している問題・エラーメッセージ

https://teratail.com/questions/209972?whotofollow=
こちらのページのベストアンサーの方の回答を参考に実装してみたのですが、うまく値段の値を取得することができません。
printコマンドで変数の値を表示できません。

private func calculate() { // セル選択時と選択解除時に呼ぶ indexPaths = tableView.indexPathsForSelectedRows! indexPaths.forEach { indexPath in // indexPath.section, indexPath.row から twoDimArray の対応する物を探す let name = twoDimArray[indexPath.section][indexPath.row] var price: Int if indexPath.section == 0 { // 対応から値段取得 Book の section だった場合 price = Book[name]! print(price) ←セルをタップしてもコンソールに何も表示されない。 } else if indexPath.section == 1 { //... } // 合計値を出したければ、セクションごとの合計用の変数を用意しておいて足していく } }
エラーメッセージ

該当のソースコード

import UIKit class TableViewController: UITableViewController { var mySections = [String]() var twoDimArray = [[String]]() var indexPaths = [IndexPath]() let Book = [ "BookA":1450, "BookB":550, "BookC":1100, "BookD":1000, "BookE":1250, "BookF":3000, "BookG":2500, "BookH":800, "BookI":850, "BookJ":2000 ] let CD = [ "CDA":1000, "CDB":1000, "CDC":2000, "CDD":1000, "CDE":1000, "CDF":1000, "CDG":3000, "CDH":2000, "CDI":2000, "CDJ":1000 ] let Food = [ "FoodA":200, "FoodB":100, "FoodC":220, "FoodD":120, "FoodE":125, "FoodF":130, "FoodG":300, "FoodH":285, "FoodI":20, "FoodJ":100 ] let Sport = [ "SportA":2000, "SportB":10000, "SportC":22000, "SportD":1200, "SportE":1250, "SportF":1300, "SportG":3000, "SportH":2850, "SportI":20000, "SportJ":1000 ] let Car = [ "CarA":2000, "CarB":1000, ] override func viewDidLoad() { super.viewDidLoad() mySections = ["本","CD","食品","スポーツ用品","カー用品"] for _ in 0 ... 4{ twoDimArray.append([]) } twoDimArray[0] = Array(Book.keys).sorted() twoDimArray[1] = Array(CD.keys).sorted() twoDimArray[2] = Array(Food.keys).sorted() twoDimArray[3] = Array(Sport.keys).sorted() twoDimArray[4] = Array(Car.keys).sorted() tableView.allowsMultipleSelection = true } override func numberOfSections(in tableView: UITableView) -> Int { return mySections.count } override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return twoDimArray[section].count } override func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? { return mySections[section] } override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "NameCell", for: indexPath as IndexPath) cell.textLabel?.text = twoDimArray[indexPath.section][indexPath.row] return cell } private func calculate() { // セル選択時と選択解除時に呼ぶ indexPaths = tableView.indexPathsForSelectedRows! indexPaths.forEach { indexPath in // indexPath.section, indexPath.row から twoDimArray の対応する物を探す let name = twoDimArray[indexPath.section][indexPath.row] var price: Int if indexPath.section == 0 { // 対応から値段取得 Book の section だった場合 price = Book[name]! print(price) } else if indexPath.section == 1 { //... } // 合計値を出したければ、セクションごとの合計用の変数を用意しておいて足していく } } }
ソースコード

試したこと

ここに問題に対して試したことを記載してください。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fuzzball

2019/09/05 02:00

>>printコマンドで変数の値を表示できません。 というのは、何も表示されないということでしょうか? それとも、正しい値が表示されないということでしょうか? また、nameは正しく取得できているのでしょうか?
退会済みユーザー

退会済みユーザー

2019/09/05 06:02

calculate()の呼び出し元は存在しているのでしょうか?
narunaru

2019/09/06 00:58

fuzzballさん、tyobigorouさん返信が遅れてすみませんでした。質問ありがとうございます。 セルが選択された時に呼び出される関数とセルの選択が外れた時に呼び出される関数を利用したら、printコマンドで変数の値を表示することができました。そして、nameも正しく取得することができました!(商品の名前が表示されるようになりました) しかし、金額を取得することができませんでした。 print(name.values) と打つと、 "" Value of type 'String' has no member 'values' "" とエラーが発生してしまいます。 どのようにすれば、商品の金額を取得できるか教えていただきたいです。 よろしくお願いいたします。m(_ _)m ソースコードです。 ` // セルが選択された時に呼び出される override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { let cell = tableView.cellForRow(at:indexPath) indexPaths = tableView.indexPathsForSelectedRows! indexPaths.forEach { indexPath in // indexPath.section, indexPath.row から twoDimArray の対応する物を探す var name = twoDimArray[indexPath.section][indexPath.row] var price: Int if indexPath.section == 0 { // 対応から値段取得 Book の section だった場合 print(name) } else if indexPath.section == 1 { //... } // 合計値を出したければ、セクションごとの合計用の変数を用意しておいて足していく } } // セルの選択が外れた時に呼び出される override func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath) { let cell = tableView.cellForRow(at:indexPath) var name = twoDimArray[indexPath.section][indexPath.row] var price: Int print(name) } `
fuzzball

2019/09/06 01:06

price = Book[name]! じゃなかったんでしょうか? valuesってどこから出てきました?
narunaru

2019/09/06 06:03

失礼しました。下記のソースコードに直したら、選択した商品の金額を取得することができました! しかし、選択した商品の合計金額を出したいのですが、エラーが起こりました。 エラーメッセージ: Variable 'section0_price' passed by reference before being initialized どのようにすればよいでしょうか?お願いしますm(_ _)m ` // セルが選択された時に呼び出される override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { let cell = tableView.cellForRow(at:indexPath) indexPaths = tableView.indexPathsForSelectedRows! indexPaths.forEach { indexPath in // indexPath.section, indexPath.row から twoDimArray の対応する物を探す var name = twoDimArray[indexPath.section][indexPath.row] var price: Int var section0_price: Int //セクション0の合計金額を入れる変数 if indexPath.section == 0 { // 対応から値段取得 Book の section だった場合 price = Book[name]! print(price) //選択した商品の金額を表示する。 section0_price += price // 選択した商品の合計金額を出したいが、エラーが起こる。エラーメッセージ: Variable 'section0_price' passed by reference before being initialized // print(section0_price) } else if indexPath.section == 1 { //... } // 合計値を出したければ、セクションごとの合計用の変数を用意しておいて足していく } } `
fuzzball

2019/09/06 06:09

あの、前のエラーもそうなんですけど、エラーメッセージ読んでます?
narunaru

2019/09/06 06:51

エラーメッセージ読んでエラー解決できました。ご指摘ありがとうございます。。
narunaru

2019/09/06 07:53 編集

追加で質問があります。 下記のようなソースコードにするとセルを選択したときに商品の金額を表示できるのですが、 2つ以上商品を選択したときに、選択した商品の金額以外にも、既に選択されている商品の金額も再度表示されてしまいます。 そのため、合計金額を正しく計算できません。どのようにすれば良いでしょうか?お願いしますm(_ _)m ` price = Book[name]! print(price) section0_price += price // 合計金額を正しく計算できない。 print(section0_price) `
guest

回答1

0

"BookA": {"price": 1450, "selected": false} とかにして、セル選択時に Book[BooktwoDimArray[indexPath.section][indexPath.row]].selected = true にして、集計時に selected == true のものをフィルターしたらいいのでは

投稿2019/09/05 00:43

thyda.eiqau

総合スコア2982

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問