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

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

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

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

Q&A

解決済

1回答

761閲覧

[Swift]他のコントローラの変数をプラス1したい

987654321

総合スコア28

Swift

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

0グッド

0クリップ

投稿2020/07/01 00:55

編集2020/07/01 01:12

やっていること&やりたいこと

診断アプリを作っています。
yesボタンを押すと最後の結果画面にyesを押した数を表示させたいと思っていますが、うまくいきません。

該当コード

質問画面でyesを押した時のメソッド

swift

1 @IBAction func tapYesButton(_ sender: Any) { 2 if let resultViewController = storyboard?.instantiateViewController(withIdentifier: "result") as? ResultViewController { 3 resultViewController.applicableNumber += 1 4 } 5 goNextQuestion() 6 } 7 8 9 func goNextQuestion() { 10     // 次の質問がない場合は結果画面に行く 11 guard let nextQuestion = QuestionDataMannager.shareInstance.nextQuestion() else { 12 if let resultViewController = storyboard?.instantiateViewController(identifier: "result") as? ResultViewController { 13 present(resultViewController, animated: true, completion: nil) 14 } 15 return 16 } 17 18 // 次の質問へ行く 19 if let nextQuestionViewController = storyboard?.instantiateViewController(withIdentifier: "question") as? QuestionViewController { 20 nextQuestionViewController.questionData = nextQuestion 21 present(nextQuestionViewController, animated: true, completion: nil) 22 } 23 }

結果画面のコントローラー

swift

1class ResultViewController: UIViewController { 2 3 @IBOutlet weak var applicableNumberLabel: UILabel! 4 5 var applicableNumber: Int = 0 6 override func viewDidLoad() { 7 super.viewDidLoad() 8 9 applicableNumberLabel.text = "(applicableNumber)個に該当" 10 } 11}

なぜこの実装をしたか

まず質問画面のyesをタップした時に、結果画面のコントローラーであるResultViewControllerにある変数applicableNumberに1を足せば良いと考えました。
ですので、質問画面のyesを押した時のメソッドにidentifierを使ってResultViewControllerをセットしました。
そしてresultViewController.applicableNumber += 1と言う形で自己代入する形にしましたが、ちゃんと自己代入できず、0のまま表示されてしまいます。

やり方がわかる方がいらっしゃれば、ご教授願います。

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

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

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

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

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

TsukubaDepot

2020/07/01 01:05

上記のコードですが、具体的に次画面への遷移はどのようにして行われていますでしょうか。 ご自身でinstantiateViewController()を使ってViewControllerのインスタンスを作られたのであれば、present()で表示する必要があるのですが、その部分が上記のコードでは見当たりません。 もし、パーツからSegueを直接張ったり、あるいは別のところでperformSegueを実行しているのであれば、上記のコードではうまくいかないかもしれません。
987654321

2020/07/01 01:14

ご回答ありがとうございます。 私の質問を編集しました。 goNextQuestionと言うメソッドで次の問題がある場合とない場合で処理を分けてみました。
guest

回答1

0

ベストアンサー

Swift

1 2 @IBAction func tapYesButton(_ sender: Any) { 3 if let resultViewController = storyboard?.instantiateViewController(withIdentifier: "result") as? ResultViewController { 4 resultViewController.applicableNumber += 1 5 } 6 goNextQuestion() 7 }

ここで instantiate (インスタンス化)した、つまり次の画面のインスタンス(実体)と

Swift

1 func goNextQuestion() { 2     // 次の質問がない場合は結果画面に行く 3 guard let nextQuestion = QuestionDataMannager.shareInstance.nextQuestion() else { 4 if let resultViewController = storyboard?.instantiateViewController(identifier: "result") as? ResultViewController { 5 present(resultViewController, animated: true, completion: nil) 6 } 7 return 8 } 9 10 // 後略 11

ここで instantiateした次画面のインスタンスは全く別のインスタンスとなります。

流れとしては

  1. 次の画面のインスタンスを作る(instantiateViewControllerなど)
  2. 必要に応じてインスタンスのプロパティに値を渡したりする(いわゆる「値渡し」)
  3. 作ったインスタンスを実際に表示する(presentなど)

という流れに沿う必要があります。

全体を見ていないのでこの修正でうまくいくかはわかりませんが、やろうとしていらっしゃることは

Swift

1 @IBAction func tapYesButton(_ sender: Any) { 2 // ここでは値渡しをしない 3 goNextQuestion() 4 } 5 6 func goNextQuestion() { 7     // 次の質問がない場合は結果画面に行く 8 guard let nextQuestion = QuestionDataMannager.shareInstance.nextQuestion() else { 9 if let resultViewController = storyboard?.instantiateViewController(identifier: "result") as? ResultViewController { 10 // ここで渡す 11 resultViewController.applicableNumber += 1 12 present(resultViewController, animated: true, completion: nil) 13 } 14 return 15 } 16 17 // 次の質問へ行く 18 if let nextQuestionViewController = storyboard?.instantiateViewController(withIdentifier: "question") as? QuestionViewController { 19 nextQuestionViewController.questionData = nextQuestion 20 present(nextQuestionViewController, animated: true, completion: nil) 21 } 22 }

ということではないでしょうか(applicableがもし正解数を表すのであれば、何問正解しても正解数は1となってしまいそうですが)。

ちなみに、

Swift

1 2 @IBAction func tapYesButton(_ sender: Any) { 3 if let resultViewController = storyboard?.instantiateViewController(withIdentifier: "result") as? ResultViewController { 4 resultViewController.applicableNumber += 1 5 } 6 goNextQuestion() 7 }

のコードで代入された resultViewControllerという変数のスコープ(生存範囲)は

Swift

1 if let resultViewController = storyboard?.instantiateViewController(withIdentifier: "result") as? ResultViewController { 2 // ここから 3 resultViewController.applicableNumber += 1 4 // ここまで 5 }

となるため、せっかくインスタンス化しても、//ここまでのところを過ぎると消滅してしまうため、代入した値も消えてしまいます(スコープとかブロックというキーワードで探せるかと思います)。

正確には if let 以降から(if文で複数の条件を羅列するような場合) defer(ブロックを抜けた際の最終処理の定義)まで含まれるのですが、たぶんそれは先の話になるとおもいますので、まずは上記の点を押さえておけば良いかと思います。

投稿2020/07/01 01:25

TsukubaDepot

総合スコア5086

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

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

987654321

2020/07/01 02:16

ご回答頂きありがとう御座います!私が書いているところでは、数字がされないのですね、、、 他の方法を模索してみます!
TsukubaDepot

2020/07/01 02:34

元となったコードがなんとなく「本気ではじめるiPhoneアプリ作り Xcode 10.x対応」のMyQuizのような感じがするのですが(違ってたらすみません)。 もし、このような流れで、具体的になにをやりたかったのか明確にしていただければ、最終的にどのようにすれば良いのかコメントすることも可能ですので、また迷ったらご質問いただければと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問