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

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

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

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

Q&A

解決済

1回答

1066閲覧

swiftでログインの様な振る舞いをする画面の実装

YusukeAoki

総合スコア6

Swift

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

0グッド

0クリップ

投稿2020/03/20 05:15

前提・実現したいこと

swiftでGPSで走行記録をとるアプリケーションを作成しています。(ubereatsの走行記録表示みたいなもの)
ここで、画面繊維が分からず、方針を調べても、こんがらがってしまいます。どなたかわかるかたご教授いただけませんでしょうか?

発生している問題・エラーメッセージ

イメージ説明
この様な画面遷移を行うものを作成したいです。
測位画面にはsecond
設定画面にはthird
初回のみの画面にはonlyfirstというstoryboardIDを振っています。

該当のソースコード

swift

1SceneDelegate.swift 2 3import UIKit 4 5class SceneDelegate: UIResponder, UIWindowSceneDelegate { 6 7 var window: UIWindow? 8 9 10 func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) { 11 // Use this method to optionally configure and attach the UIWindow `window` to the provided UIWindowScene `scene`. 12 // If using a storyboard, the `window` property will automatically be initialized and attached to the scene. 13 // This delegate does not imply the connecting scene or session are new (see `application:configurationForConnectingSceneSession` instead). 14 15 16 //sceneのオプショナル対策 17 guard let scene = (scene as? UIWindowScene) else { return } 18 19 let window = UIWindow(windowScene: scene) 20 self.window = window 21 window.makeKeyAndVisible() 22 if UserDefaults.standard.bool(forKey: "tutorialShown") == false{ 23 let storyboard = UIStoryboard(name: "Main", bundle: nil) 24 let vc = storyboard.instantiateViewController(identifier: "onlyfirst") 25 window.rootViewController = vc 26 let tutorial = "初期値" 27 UserDefaults.standard.set(tutorial, forKey: "tutorialShown") 28 }else{ 29 let storyboard = UIStoryboard(name: "Main", bundle: nil) 30 let vc = storyboard.instantiateViewController(identifier: "second") 31 window.rootViewController = vc 32 } 33 34 }

試したこと

調査など

ここにより詳細な情報を記載してください。
初回登録画面にて、名前などの情報を入力するのですが、その際にはuserdefaultsに入れる様にしています。
この画面をインストールした後の初回起動時のみ表示したく、2回目以降は測位画面からスタートする様にしたいです。
現状画面遷移自体は問題なくできているのですが、アプリを一度キルしてしまうと、元に戻ってしまいます。
SceneDelegate.swiftにて以上の様な記述をしております。
これだと、思った通りに動作ができずに困っています。
どなたかご教授いただけますと幸いです。

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

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

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

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

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

guest

回答1

0

ベストアンサー

結論から言えば、

swift

1 let tutorial = "初期値" 2 UserDefaults.standard.set(tutorial, forKey: "tutorialShown") 3 }else{

という行を、

swift

1 // 次の行をコメントアウト、もしくは削除する 2 // let tutorial = "初期値" 3 4 // Bool型で書き込む 5 UserDefaults.standard.set(true, forKey: "tutorialShown") 6 }else{

と修正すればご希望の動作をすると思います。


起動時に

swift

1 if UserDefaults.standard.bool(forKey: "tutorialShown") == false{

という行で"tutorialShown"というキーに紐づいた値を Bool値で調べています。

このbool(forKey:)というメソッドは、指定されたキーに紐づいた値に応じてBool値を返すようになっています。

bool(forKey:)

ドキュメントを読むと、

This method automatically coerces certain ”truthy” values—such as the strings "true", "YES", and "1", and the numbers 1 and 1.0—to the Boolean value true. The same is true for certain ”falsy” values—such as the strings "false", "NO", and "0", and the numbers 0 and 0.0—which are automatically coerced to the Boolean value false.

とありました。

つまり、書き込み時に"true""1"あるいは数値型の'1'など、”真”として処理できる値が書き込んであればtrueとして扱いますが、それ以外だとfalseという扱いになってしまします。

一方、書き込み時は

swift

1 let tutorial = "初期値" 2 UserDefaults.standard.set(tutorial, forKey: "tutorialShown") 3 }else{

と文字型で書き込んでいます。なので、bool(forKey:)というメソッドで読み込むとfalseという結果しか得られないということになります。

質問者さんの先日の質問を拝見したところ、Bool型での処理を提案されていましたので、ここではBool型での読み書きに統一することをお勧めします。

また、先日の質問ではhoshi-takanoriさんが引用も含めて詳細に説明されていますから、そちらを再度よく確認されてはいかがでしょうか。

投稿2020/03/20 07:46

編集2020/03/20 08:11
TsukubaDepot

総合スコア5086

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

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

YusukeAoki

2020/03/20 14:03

なるほど、自分で動作をさせてみて理解できました。 swiftにおける方の取り扱いを、ご指摘の点を含め、よく確認したいとおもいます ありがとうございます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問