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

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

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

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

Q&A

解決済

1回答

363閲覧

Swiftで初回起動画面を動的に切り替える方法についてです。

Hayato1201

総合スコア220

Swift

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

0グッド

0クリップ

投稿2018/09/05 01:17

編集2018/09/05 02:01

以下の様にAppDelegate.swiftを編集して、初回起動時のVCを動的変更しようとしています。VCはMainpage.storyboardに2つあり、storyboardIDがnextとなっているものを状況に応じてinitialVCにしたいです。しかし以下の様にエラーが出てしまいます。。。AppDelegate.swiftでそれに関係のある処理を以下に示します。

swift

1@UIApplicationMain 2class AppDelegate: UIResponder, UIApplicationDelegate { //Thread 1: signal SIGABRT ⇦ここでエラー 3 4 var window: UIWindow? 5 6 func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { 7 8 9 if Preference.firstLaunchedAt != nil{ 10 //windowを生成 11 self.window = UIWindow(frame: UIScreen.main.bounds) 12 //Storyboardを指定 13 let storyboard = UIStoryboard(name: "Mainpage", bundle: nil) 14 //Viewcontrollerを指定 15 let initialViewController = storyboard.instantiateViewController(withIdentifier: "next") 16 self.window?.rootViewController = initialViewController 17 //表示 18 self.window?.makeKeyAndVisible() 19 }else{ 20 21 } 22 23 return true 24 }

Preference.firstLaunchedAtではUserDefaults.standardを使っています。ここにデータを保存されていればnextを起動すると言う様にしたいです。

因みにエラーが出てたときにコンソールに出ているのはlibc++abi.dylib: terminating with uncaught exception of type NSExceptionと言うメッセージです。
このアプリはまず起動するとToppage.storyboardに行き、そこからボタンを押すとMainpage.storyboardに飛ぶ様にしているのですが、このエラーはアプリ起動時のToppage.storyboardに行く前に出ます。どうすればこれを直せるでしょうか?

ーーーーーーーーーー追記ーーーーーーーーーーーーー

二回目以降だけにnextが起動される訳ではなく、Preference.firstLaunchedAtにデータが入っている場合はnextから起動したいです。Preference.firstLaunchedAtにはnilが入っている場会もあり、アプリが処理の途中で終了した場合などにPreference.firstLaunchedAtに値が入ったままの状態にしておきしっかり終わってから終了した場合はnilになっています。そしてエラーが出ているのはPreference.firstLaunchedAtがnilでは無い時です。なのでif Preference.firstLaunchedAt != nil以降の処理に問題があるんだと思います、、、

参考までにPreferenceのコードを以下に載せます。

swift

1struct Preference { 2 static let userDefault = UserDefaults.standard 3 4 struct Key { 5 static let FirstLaunchedAt = "first_launched_at" 6 } 7} 8 9extension Preference { 10 11 static var firstLaunchedAt: Date? { 12 get { 13 return userDefault.object(forKey: Key.FirstLaunchedAt) as? Date 14 } 15 set { 16 userDefault.set(newValue, forKey: Key.FirstLaunchedAt) 17 userDefault.synchronize() 18 } 19 } 20}

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

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

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

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

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

fuzzball

2018/09/05 01:38 編集

!= nil だと「初回起動じゃないとき」になりませんか?【追記】二回目以降がnextということでいいんですね。今は != nil の中を通っていて、それで落ちるということでしょうか?
Hayato1201

2018/09/05 02:01

追記させていただきました!
Hayato1201

2018/09/05 02:03

今は != nil の中を通っていてそれで落ちると言う事です!Preference.firstLaunchedAtがnilでは無い時に != nil の中を通ってnextから起動させたいです!
guest

回答1

0

ベストアンサー

swift

1if Preference.firstLaunchedAt != nil { 2 //ここ 3 : 4} else { 5}

「ここ」を通っているのであれば、原因は、

  • nextなViewControllerの取得
  • nextなViewController側の問題

のどちらかでしょう。

まず、Storyboard IDにnextが正しく設定されてるか再確認して下さい。
また、nextなViewControllerのviewDidLoad()に処理が来ているかどうか調べて下さい。

投稿2018/09/05 02:16

fuzzball

総合スコア16731

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

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

fuzzball

2018/09/05 02:20

その前に、Storyboardの名前が Mainpage で合っているか確認して下さい。 無駄なスペース、全角文字など。大文字小文字も区別されます。
fuzzball

2018/09/05 02:22

さらにその前に、Consoleにエラーメッセージ出てませんか?
Hayato1201

2018/09/05 02:26

その通りでした、すみませんStoryboardの名前のミスでした。。。 回答ありがとうございます!!
fuzzball

2018/09/05 02:35 編集

次回からはConsoleのエラーメッセージもチェックして下さい。(質問文にも記載して下さい) 今回の場合でしたら、 *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Could not find a storyboard named 'ほげほげ' in bundle NSBundle (以下略) という、「Storyboardが見つからない」というエラーですので、自身でも原因に辿り着けたかもしれません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問