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

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

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

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Swift

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

Q&A

解決済

1回答

1183閲覧

iOSアプリで起動時のスプラッシュ画面が終わってから、ViewControllerの処理に入ってほしい

HajimeHamada

総合スコア20

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Swift

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

0グッド

1クリップ

投稿2018/03/01 10:45

編集2018/03/01 10:47

例えば、以下のような簡単なViewController.swiftを作ります。

Swift

1import UIKit 2 3class ViewController: UIViewController { 4 5 @IBOutlet weak var myLabel: UILabel! 6 7 override func viewDidLoad() { 8 super.viewDidLoad() 9 myLabel.text = "sleep..." 10 sleep(10) 11 myLabel.text = "done" 12 } 13 14 override func didReceiveMemoryWarning() { 15 super.didReceiveMemoryWarning() 16 } 17}

起動時にlabelを「sleep...」とし10秒後に「done」に変える、というだけのものです。このアプリでLaunchScreen.storyboardを使ってスプラッシュ画面を表示した場合、希望の動作としては、

スプラッシュ画面表示→「sleep...」表示→10秒そのまま→「done」に表示変更

となって欲しいのですが、何故か、

スプラッシュ画面表示→10秒そのまま→「done」が表示

と「sleep...」が表示されません。ネットで調べると、特別なことをしなければスプラッシュ画面が表示されている間にバックグラウンドで何か処理することはないという記述が見られるので、なぜ下側のような挙動になるのかがわかりません。上側のようなスプラッシュ画面が終わってからViewControllerの処理に入るようにするには、どうしたらいいのでしょうか?

xcodeはVersion 9.2 (9C40b)です。

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

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

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

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

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

guest

回答1

0

ベストアンサー

私の環境ですと下記の3つの設定をすることでできているようなのですが、
いかがでしょうか?

イメージ説明

イメージ説明

イメージ説明

2018/3/2 追記

Main.storyboardのViewControllerのラベルの初期値を「sleep...」にしておいて
下記のように処理をするとイメージされているような動きでしょうか?

Swift

1 2class ViewController: UIViewController { 3 4 @IBOutlet weak var label: UILabel! 5 6 override func viewDidLoad() { 7 super.viewDidLoad() 8 } 9 10 override func viewDidAppear(_ animated: Bool) { 11 super.viewDidAppear(animated) 12 13 DispatchQueue.global().async { 14 sleep(10) 15 DispatchQueue.main.async { 16 self.label.text = "Done" 17 } 18 } 19 } 20}

GIFを作成してみました。
あえてスプラッシュは「スプラッシュ」として処理の遷移が見えるようにしています。

![イメージ説明

投稿2018/03/01 11:17

編集2018/03/01 21:44
newmt

総合スコア1277

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

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

HajimeHamada

2018/03/01 11:42

ご回答ありがとうございます。これはLaunchScreenで「sleep...」を表示するということですね。確かにこれでできるのですが、現状他の少し大きなアプリの開発をしておりまして、スプラッシュ画面が終わった後に処理に入ってもらいたい、言い換えると、スプラッシュ中にViewControllerの処理をしてほしくないという希望があります。お示ししたのは、動作を示すための簡単な例です。 よろしくお願いします。
newmt

2018/03/01 12:34

もう少し詳しく教えて頂きたいのですが、 上記の場合ViewControllerの中でsleepしているので、スプラッシュ画面を終了してViewController(Main)へ処理が移っているはずですが、このタイミングではなくdoneが表示された後に処理をしたいということでしょうか?
HajimeHamada

2018/03/01 15:31

やりたいのは、 スプラッシュ画面終了→(ViewControllerの処理へ)→「sleep...」の表示 ... という流れです。今の私の環境では、スプラッシュ画面がずっと表示されっぱなしで10秒が経過してしまうので、スプラッシュ画面表示のbackgroundで、ViewController内の処理が行われている感じがします。もしかして、newmtさんとは、動作が違うのでしょうか?
newmt

2018/03/01 21:45

ちょっとイメージされていた動きと違ったようです。申し訳ございません。回答に追記をしたのでご確認していただけませんでしょうか?
HajimeHamada

2018/03/02 00:03

完全にイメージしていた動きです。ありがとうございます!同じ処理をviewDidLoadに書いても大丈夫なようです。 なぜスレッドを使うと大丈夫なのかが理解できないのですが、もしよろしければ、教えていただけますか? # アニメーションGIFは動かないようです。teratailの問題ですかね。
newmt

2018/03/02 00:34

全然詳しくないのですが、 スレッド(DispatchQueue.global().async)を使うことで その場の処理(今回はViewDidAppear)は抜けますが、 スレッド内で処理(self.label.text = "Done")をメインスレッドで実行することを指定している(DispatchQueue.main.async)ため、 処理(self.label.text = "Done")の実行順序がviewDidapperが終わったあとに回ったという認識です。 # GIFは私のMACですとクリックして別画面で動きが見えるのですが、何か方法が間違っているのかもしれません。すいません。
HajimeHamada

2018/03/02 01:52

了解です。ご丁寧におつきあいくださりありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問