🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
AdMob

AdMobは、事前に指定した条件に従ってアプリに広告を表示するGoogleのサービス。開発者の向けのサービスで、広告を掲載することにより、収益を得ることが可能です。その他、見た目や雰囲気などアプリに合う広告に変更したり、広告表示の場所を指定することもできます。

Xcode

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

Swift

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

Q&A

解決済

1回答

388閲覧

if構文の中にデータを引き継ぐには

sansyou69

総合スコア31

AdMob

AdMobは、事前に指定した条件に従ってアプリに広告を表示するGoogleのサービス。開発者の向けのサービスで、広告を掲載することにより、収益を得ることが可能です。その他、見た目や雰囲気などアプリに合う広告に変更したり、広告表示の場所を指定することもできます。

Xcode

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

Swift

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

0グッド

0クリップ

投稿2019/09/23 12:31

Admobのインタースティシャル広告の設定の関係で、

private func next(times:DefaultTime) { // 設定値を追加 times.check = self.zeroOverCheck.isOn let vc = storyboard!.instantiateViewController(withIdentifier: "MainViewController") as! MainViewController vc.defaultTime = times self.present(vc, animated: true, completion: nil) } ```だったのを、 ```ここに言語を入力 private func next(times:DefaultTime) { // 設定値を追加 times.check = self.zeroOverCheck.isOn // 画面遷移 if interstitial.isReady { let vc = storyboard!.instantiateViewController(withIdentifier: "MainViewController") as! MainViewController vc.defaultTime = times interstitial.present(fromRootViewController: self) self.present(vc, animated: true, completion: nil) } else { print("Ad wasn't ready") } }

と修正しました。

すると、前は上手くいっていたデータの受け渡し(=times)が、通らなくなってしまいました。
おそらく、if構文が壁となっているんだろうと思います。
この場合、どう処理したらいいのでしょうか。
よろしくお願いします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

インタースティシャル広告を使ったことはないのですが、

Swift

1let vc = storyboard!.instantiateViewController(withIdentifier: "MainViewController") as! MainViewController 2vc.defaultTime = times

の位置を調整してみてはいかがですか?

interstitial.present(fromRootViewController: self)の後に書いてみるとか
また、times.check = self.zeroOverCheck.isOnが離れているのも気になります。

ちなみに、インタースティシャル広告にはclosure的な関数の終わりや、
表示終了結果を得る方法は用意されていないのですか?
closure:
https://qiita.com/narukun/items/b1b6ec856aee42767694

関係のないことですが、引数で受け取ったものを利用して何かを行わず、
引数自体に他のメンバ変数を代入しているのは変な気がしますが、、、

googleのサンプルをみてみましたが、
https://github.com/googleads/googleads-mobile-ios-examples/blob/master/Swift/admob/InterstitialExample/InterstitialExample/ViewController.swift
closureなどで終了を取得する必要はないみたいですね。
単純に直列処理されているように見えますよ。

なので、以下のように修正すればいいのではないでしょうか?

Swift

1private func next(times:DefaultTime) { 2 if interstitial.isReady { 3 interstitial.present(fromRootViewController: self) 4 } else { 5 print("Ad wasn't ready") 6 } 7 // 設定値を追加 8 times.check = self.zeroOverCheck.isOn 9 // 画面遷移 10 let vc = storyboard!.instantiateViewController(withIdentifier: "MainViewController") as! MainViewController 11 vc.defaultTime = times 12 self.present(vc, animated: true, completion: nil) 13}

広告が準備できていない時、画面遷移できないと、
ユーザーはその時点で止まってしまって、バグとなってしまいますし。

9/25 追記
うーん、難しいですね。
インタースティシャル広告を自分が使ってたら、実機で試してお答えできるのですが、、、

nextを呼び出す部分でどうなっているのかわかりませんが、
print()を代入し、実際に渡している値、順序を確認することですかね。

Swift

1private func next(times:DefaultTime) { 2 times.check = true // <-これを適宜、各printの前に移動する。 3 print("1:", times) 4 if interstitial.isReady { 5 print("2-1:", times) 6 interstitial.present(fromRootViewController: self) 7 print("2-2:", times) 8 } else { 9 print("3-1:" times) 10 print("Ad wasn't ready") 11 } 12 print("4:", times) 13 // 設定値を追加 14 // times.check = self.zeroOverCheck.isOn ここは一旦コメントアウト 15 // 画面遷移 16 let vc = storyboard!.instantiateViewController(withIdentifier: "MainViewController") as! MainViewController 17 vc.defaultTime = times 18 print("5:", times) 19 self.present(vc, animated: true, completion: nil) 20 print("6:", times) 21}

まず、上記を試してみて、各printの前で値を変え、
期待の動きをする箇所を探すのがいいと思います。
もし、しないようなら、、、実装方法を変える必要があるということだと思います。
それこそ、closureを使うとか、GCDを使うかとか、、、

ちなみに、DefaultTimeの構造がわかったので、余計なことですが、
func next内ではDefaultTimeのcheck(Bool型)のみ変更しているので、
timesはメンバ変数で持っている?ことを前提にすると、

Swift

1private func next(bool: Bool) { 2 // ~~ 省略 3 self.times.check = bool 4 // ~~ 省略 5}

viewを通して保持しておきたいと思いますので、メンバ変数にするのがいいと思います。
もし新たに作るとしたら、func next内で作ればいいと思いますし。

後、timesにすると、複数形なので [DefaultTime] のように複数あるイメージになりますよ。

投稿2019/09/23 23:51

編集2019/09/24 16:01
hameji

総合スコア1380

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

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

sansyou69

2019/09/24 14:39 編集

心のこもったご返信、ありがとうございます。 職場でそれを読んで期待し、帰宅後、いただいた内容に修正して、試してみました。 結果は、残念ながら変わりませんでした。 ただ、私の方で、先に伝えておくべき内容のデータがありました。 DefaultTime.swift import UIKit class DefaultTime: NSObject { var start:String = "09:00" var end:String = "18:00" var rest:String = "01:00" var work:String = "08:00" var check:Bool = false } こちらが、同アプリの違う階層にデータとしてあって、先のページで設定される数字(=時刻)ではなく、こちらが呼び込まれてしまうという状態です。 説明が不十分で、申し訳ありません。
sansyou69

2019/09/27 17:20

繰り返しのお返事、ありがとうございました。 なんとか、解決することができました。 協力者がいて、その方にお手伝いしていただき解決できたのですが、問題は一つだけではありませんでした。 何度か試行錯誤して、やっと解決できました。 言われるとおり、確かに部分的なコードだけ見せられても、分かりずらかったかもしれません。 近くにいたなら、ご飯とか一緒にして(もちろん私が払って)、お話したかったです。 また、何か問題が生じましたら、ご意見いただけると嬉しいです。 今回は、ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問