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

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

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

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

Q&A

解決済

1回答

1570閲覧

デリゲートメソッドが実行されない

oeiqgfodgfhps

総合スコア35

Swift

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

0グッド

0クリップ

投稿2020/06/10 07:10

DetailViewControllerで合計金額を再計算し、その結果をIndexViewControllerに渡し、sumMoneyLabelに再描画するという機能を実現したいです。
以下のようにプロトコルとデリゲートを実装したのですが、ラベルが際描画されませんでした。
デリゲートメソッドを実装している部分でログを出してみたのですが、ログは出力されなかったので、そもそもデリゲートメソッドが実行されていないのではないかと思っています。
どのように改修するべきでしょうか?ご指導お願いいたします。

IndexViewController

Swift

1import UIKit 2import Firebase 3import FirebaseFirestore 4 5class IndexViewController: UIViewController,UITableViewDelegate,UITableViewDataSource,DetailViewControllerDelegate { 6 7 8 let detailView = DetailViewController() //detailViewControllerのインスタンス化 9 let uid = Auth.auth().currentUser!.uid 10 11 var sumMoneyString = "0" 12 var titleString = String() 13 var money = Int() 14 var descriptionString = String() 15 var documentIdString = String() 16 var patientsArray = [Patiences]() 17 var documentIdArray:[Any] = [] 18 19 @IBOutlet weak var sumMoneyLabel: UILabel! 20 @IBOutlet weak var tableView: UITableView! 21 22 23 override func viewDidLoad() { 24 25 super.viewDidLoad() 26 tableView.delegate = self 27 tableView.dataSource = self 28 detailView.delegate = self //デリゲートを自分に指定 29 sumMoneyLabel.text = sumMoneyString 30 31 fetchData(uid: uid) 32 33 } 34 //セクションの数の指定 35 func numberOfSections(in tableView: UITableView) -> Int { 36 return 1 37 } 38   //セルの数の指定 39 func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 40 return patientsArray.count 41 } 42   //セルの指定 43 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 44 let cell = tableView.dequeueReusableCell(withIdentifier: "cell") 45 let titleCell = cell?.viewWithTag(1) as! UILabel 46 let moneyCell = cell?.viewWithTag(2) as! UILabel 47 let documentId = documentIdArray[indexPath.row] 48 let description = patientsArray[indexPath.row].description 49 titleCell.text = patientsArray[indexPath.row].title 50 moneyCell.text = String(patientsArray[indexPath.row].money) 51 return cell! 52 } 53   //セルの高さの指定 54 func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { 55 return self.view.frame.size.height / 5 56 } 57 //セルが押された時の挙動 DetailVCへ移動 58 func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 59 titleString = patientsArray[indexPath.row].title 60 money = patientsArray[indexPath.row].money 61 documentIdString = documentIdArray[indexPath.row] as! String 62 descriptionString = patientsArray[indexPath.row].description 63 performSegue(withIdentifier: "toDetail", sender: nil) //DetailVCへ遷移 64 } 65 //DetailVCへの値の受け渡し 66 override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 67 let detailVC = segue.destination as! DetailViewController 68 detailVC.titleString = titleString 69 detailVC.descriptionString = descriptionString 70 detailVC.moneyString = String(money) } 71 //テーブルに表示するデータを取得し、配列patientsArrayに挿入 72 func fetchData(uid:String){ 73 let docRef = db.collection("patients") 74 docRef.whereField("uid", isEqualTo: uid).getDocuments { (QuerySnapshot, err) in 75 for document in QuerySnapshot!.documents { 76 self.documentIdArray.append(document.documentID) 77 let title = document.data()["title"] 78 let money = document.data()["money"] 79 let description = document.data()["description"] 80 self.patientsArray.append(Patiences(title: title as! String, money: money as! Int, description: description as! String)) 81 } 82 83 self.tableView.reloadData() 84 } 85 86 } 87 //DetailVC側から受け取った値をString型に変換し、sumMoneyLabelに代入 88 func didAdded(sumMoney: Int) {     //デリゲートメソッドの実装 89 print(sumMoney) 90 sumMoneyLabel.text = String(sumMoney) 91 print(sumMoneyLabel.text) 92 print("合計金額の表示") 93 } 94 95}

DetailViewController

Swift

1import UIKit 2protocol DetailViewControllerDelegate{  //プロトコルの定義 3 func didAdded(sumMoney:Int) 4} 5 6class DetailViewController: UIViewController { 7 8 var delegate:DetailViewControllerDelegate? = nil 9 var titleString = String() 10 var moneyString = String() 11 var descriptionString = String() 12 13 @IBOutlet weak var titleLabel: UILabel! 14 @IBOutlet weak var moneyLabel: UILabel! 15 @IBOutlet weak var descriptionLabel: UILabel! 16 override func viewDidLoad() { 17 super.viewDidLoad() 18 19 titleLabel.text = titleString 20 moneyLabel.text = moneyString 21 descriptionLabel.text = descriptionString 22 } 23 //ボタンが押されたら、数字をsumMoneyに足し、デリゲートメソッドを実行 24 @IBAction func patient(_ sender: Any) { 25 var sumMoney = Int((self.storyboard?.instantiateViewController(identifier: "index") as! IndexViewController).sumMoneyString) 26 var patientMoney = Int(moneyString) 27 sumMoney = sumMoney! + patientMoney! 28 self.delegate?.didAdded(sumMoney: sumMoney!) //デリゲートメソッドの実行 29 30 } 31 32} 33

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

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

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

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

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

guest

回答1

0

ベストアンサー

swift

1// コメントアウト 2//let detailView = DetailViewController() //detailViewControllerのインスタンス化 3 4// コメントアウト 5//detailView.delegate = self //デリゲートを自分に指定 6 7override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 8 let detailVC = segue.destination as! DetailViewController 9 detailVC.delegate = self // デリゲートを設定 10} 11 12protocol DetailViewControllerDelegate: AnyObject{  //プロトコルの定義 13 func didAdded(sumMoney:Int) 14} 15 16class DetailViewController: UIViewController { 17 weak var delegate: DetailViewControllerDelegate? 18} 19

投稿2020/06/10 07:20

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

oeiqgfodgfhps

2020/06/10 15:35

ありがとうございます!無事に動きました! なぜそのように記述しないと動かないのでしょうか!
退会済みユーザー

退会済みユーザー

2020/06/10 22:49 編集

コメントアウトしたdetailViewは遷移先とは別物なので、遷移先となるdetailVCにデリゲート設定しないとうごかない。 AnyObjectはdelegateをweakで宣言(循環参照を回避)するため。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問