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

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

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

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

Swift

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

Q&A

解決済

2回答

2516閲覧

Swiftで一度だけ実行したい

sunglass

総合スコア303

Xcode

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

Swift

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

0グッド

0クリップ

投稿2021/02/22 05:34

SCLAlertViewというライブラリを使用してポップアップ表示を実装しました。

とある回数に達するとSCLAlertViewのポップアップが表示される仕組みです。
しかしtestCountの数字が(例えば)90回のままだとアプリ起動時に(数値が変化しない限りは)毎回表示されてしまいます。

https://qiita.com/YusukeHosonuma/items/95315add4004b59e5f00 のコメント欄を参考にOnesExec.swiftファイルを用意。

case文の中に書いてみたのですがやはり起動時に毎回表示されてしまいます。
簡単に 1度だけの実行方法ってないのでしょうか??

... // 一度だけ実行する関数 var onesExec = OnesExec() override func viewDidLoad() { super.viewDidLoad() switch self.testCount { case 0: print("0") case 10: self.onesExec.exec { SCLAlertView().showSuccess("お知らせ", subTitle: "10回達成。", closeButtonTitle: "閉じる") } case 20: self.onesExec.exec { SCLAlertView().showSuccess("お知らせ", subTitle: "20回達成。", closeButtonTitle: "閉じる") } case 30: self.onesExec.exec { SCLAlertView().showSuccess("お知らせ", subTitle: "30回達成。", closeButtonTitle: "閉じる") } case 40: self.onesExec.exec { SCLAlertView().showSuccess("お知らせ", subTitle: "40回達成。", closeButtonTitle: "閉じる") } case 50: self.onesExec.exec { SCLAlertView().showSuccess("お知らせ", subTitle: "50回達成。", closeButtonTitle: "閉じる") } case 60: self.onesExec.exec { SCLAlertView().showSuccess("お知らせ", subTitle: "60回達成。", closeButtonTitle: "閉じる") } case 70: self.onesExec.exec { SCLAlertView().showSuccess("お知らせ", subTitle: "70回達成。", closeButtonTitle: "閉じる") } case 80: self.onesExec.exec { SCLAlertView().showSuccess("お知らせ", subTitle: "80回達成。", closeButtonTitle: "閉じる") } case 90: self.onesExec.exec { SCLAlertView().showSuccess("お知らせ", subTitle: "90回達成。", closeButtonTitle: "閉じる") } case 100: self.onesExec.exec { SCLAlertView().showSuccess("お知らせ", subTitle: "100回達成。", closeButtonTitle: "閉じる") } case 200: self.onesExec.exec { SCLAlertView().showSuccess("お知らせ", subTitle: "200回達成。", closeButtonTitle: "閉じる") } case 300: self.onesExec.exec { SCLAlertView().showSuccess("お知らせ", subTitle: "300回達成。", closeButtonTitle: "閉じる") } case 400: self.onesExec.exec { SCLAlertView().showSuccess("お知らせ", subTitle: "400回達成。", closeButtonTitle: "閉じる") } default: break // switch文を終了させる。 } }

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

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

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

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

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

TakuyaAso

2021/02/22 06:58

関係ないですが,case を, でまとめて testCount を subTitle で使う形だとスッキリすると思います。 switch self.testCount { case 10, 20, (省略): self.onesExec.exec { SCLAlertView().showSuccess("お知らせ", subTitle: "\(self.totalCount)回達成。", closeButtonTitle: "閉じる") } default: break }
sunglass

2021/02/22 07:35

(めちゃくちゃ助かります。。こういう風にまとめて書けるんですね!)
guest

回答2

0

参考になられている記事は、「起動後に実行されるあるメソッド内で一度だけ処理させるための方法」であって、ご質問の「アプリ起動時に(数値が変化しない限りは)毎回表示」という意図から推測すると、「アプリの起動回数」をカウントする仕組みではないと思います。

簡単に 1度だけの実行方法ってないのでしょうか??

UserDefault を使い、起動回数やバージョン番号を管理するのが一番簡単で明快でないでしょうか。

投稿2021/02/22 06:34

TsukubaDepot

総合スコア5086

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

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

sunglass

2021/02/22 07:37

回答ありがとうございます。 自分の書き方が少しわかりづらかったです。。 起動時ではなく、ある値(testCount)が90に達した瞬間のみ1回だけ実行したいです。 考えられるのは90に達して出現するviewを閉じるボタンを押した後に無効化するとかでしょうか・・。 この辺の経験全然ないので質問ばかりですいません。。
TsukubaDepot

2021/02/22 09:54

この、「起動時ではなく、ある値(testCount)が90に達した瞬間」をご自身でどのように定義されているか次第だとおもいます。 「アプリとしての」ライフサイクル(起動から終了まで)のほかに、継続した利用(ここでの継続とは、起動、終了、起動、終了の繰り返しのことです)など、さまざまなイベントがあるわけですが、「どの段階でカウントアップさせるか」を明確にさせない限り、この問題は解決しないと思います。 その定義によっては AppDelegate(SceneDelegate)で処理させるのか、各ViewController の viewWillLoad で処理させるのか、あるいは viewWillAppear で処理させるのかなど、条件も変わってきます。 また、カウンタの値はリセットされるのか、それともリセットされないのか(別の言い方をすれば、「400回記念」以降は出力させる予定はないのか)などによっても変わってくるのではないでしょうか。 この定義が明確になってないのであれば、それはsunglassさんご自身が何を遂行したいのか、まだ十分にまとまっていな事になるんだと思います。
TsukubaDepot

2021/02/22 09:58

今改めてコメントを見直してみたのですが、 > 起動時ではなく、ある値(testCount)が90に達した瞬間のみ1回だけ実行したいです。 と書かれていますが、viewDidLoad に記述されている以上、起動時に限らず、この処理を記述された ViewController では、初回に一回しか実行されません。 下記の資料の中で書かれている通り、viewDidLoad の実行は、その View が(ライフサイクル上)はじめて作られるときのみです。 https://developer.apple.com/library/archive/referencelibrary/GettingStarted/DevelopiOSAppsSwift/WorkWithViewControllers.html Typically, iOS calls viewDidLoad() only once, when its content view is first created; however, the content view is not necessarily created when the controller is first instantiated. Instead, it is lazily created the first time the system or any code accesses the controller’s view property.
mskRR

2021/02/23 06:32 編集

ほぼいちゃもんでごめんね、 Typically どこかで一度だけじゃない記事を読んだような記憶が。 で、ここでviewの再読み込み系の処理ならば問題ないんだが、データのインクリメントなどをしてると notTypically の場合にへんちくりんになると言った趣旨の記事だったような。 読んだときはどんな時がnotTypicallyなのかを想像できなかったのですが。
guest

0

自己解決

とりあえず UIButtonを使ってボタンを押下したタイミングで(データを取得して)ポップアップ出す方向にしました。

回答&コメントしていただいた方ありがとうございます。。

@IBAction func testButton(_ sender: UISwitch) { ... switch test.count { case 10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 150, 200, 250, 300: SCLAlertView().showSuccess("お知らせ", subTitle: "(test.count)回達成。", closeButtonTitle: "閉じる") default: break } ... }

投稿2021/02/23 11:13

sunglass

総合スコア303

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問