2016-10-28 4 views
4

私はアプリとウォークスルーの画面を持っています。ユーザが最初にアプリケーションを開いたときにウォークスルー画面を表示したいのですが、間違っています。 AppDelegateまたは最初の画面内のViewDidLoadにコードを配置する必要があります。最初のアプリ起動の検出に失敗しました。どうすればいいですか?

super.viewDidLoad() 

    if UserDefaults.standard.bool(forKey: "isFirstLaunch") { 

     UserDefaults.standard.set(true, forKey: "isFirstLaunch") 
     UserDefaults.standard.synchronize() 
    } 
    let isFirstLaunch = UserDefaults.standard.value(forKey: "isFirstLaunch") as? Bool 
    if isFirstLaunch! { 

      let mainStoryboard = UIStoryboard(name: "ViewController", bundle: Bundle.main) 
      let vc : ViewController = mainStoryboard.instantiateViewController(withIdentifier: "ViewController") as! ViewController 
      self.present(vc, animated: true, completion: nil) 


    } 

とエラーの絵:

enter image description here

任意のIDEは、どのようにそれを行うには ここで私が使用したコードはありますか?

+0

私は似たような仕事をするGitHubのコードを持っています。 リンクは次のとおりです:https://github.com/karanthakakr04/Walkthrough-Demo.git 私はそれがあなたの必要を満たすことを望みます。もし誰かがそれを必要とするなら、この参考チュートリアルがあります:https://youtu.be/tNCsQe5vfRk –

答えて

1

(Appleは)(クラスユーザーデフォルトが示すように)方法はレジスタにデフォルト値であるお勧めします。 applicationWillFinishLaunchingで例えば - -

できるだけ早く早い時点

let defaultValues = ["isFirstLaunch" : true] 
UserDefaults.standard.register(defaults: defaultValues) 

を挿入が

override init() 
{ 
    let defaultValues = ["isFirstLaunch" : true] 
    UserDefaults.standard.register(defaults: defaultValues) 
    super.init() 
} 

アプリケーションデリゲートでinit方法であり、そして、単に

func viewDidLoad() 
    super.viewDidLoad() 
    let defaults = UserDefaults.standard 
    if defaults.bool(forKey: "isFirstLaunch") { 
     defaults.set(false, forKey: "isFirstLaunch") 
     let mainStoryboard = UIStoryboard(name: "ViewController", bundle: Bundle.main) 
     let vc : ViewController = mainStoryboard.instantiateViewController(withIdentifier: "ViewController") as! ViewController 
     self.present(vc, animated: true, completion: nil) 
    } 
} 

書きますデフォルト値はunとみなされますそれが初めて変わったときまで。

+0

私はdefaultValuesは= [true「をisFirstLaunch」]聞かせ書くなりませんいずれの場合であっても、デフォルト値を登録する行がビューコントローラの 'viewDidLoad'メソッドの前に**実行されていることを確認する必要があります。 – Ivan

+0

ですべてにはい、AppDelegateで、中: – vadian

+0

私が最初にアプリを起動すると、エラー信号SIGBARTが返されます。 私はそれをアプリケーションに入れました.WillFinishLaunching まだ動作しています アイデア? : – Ivan

0

エラーは、オプションの値をアンラップすることと関係があります。あなたがするべきことは、ユーザーのデフォルト値にまったく価値があるかどうかを確認することです。

if let isFirstLaunch = UserDefaults.standard.bool(forKey: "isFirstLaunch") { 
    //execute code for when it isn't the first launch 
} else { 
    //set value of isFirstLaunch for the first time 
} 

isFirstLaunchがnilの場合、これが最初の起動であることを意味します。あなたは、多くの問題持って

+0

'UserDefaults bool(forKey:)'はオプションではありません。このコードはコンパイルされません。 – rmaddy

2

  1. をあなたは不必要にtrueにキーを設定し、彼女はそれはあなたが必要以上にあなたがvalue(forKey:)代わりのbool(forKey:)
  2. を(使用しているsynchronize
  3. を呼び出すすでに
  4. 真でありますそして、これがあなたのクラッシュの原因です)、あなたはあなたが得る値をアンラップしません。つまり、値がゼロのときにアプリケーションがクラッシュすることを意味します。

必要なのは、このようなものです:

let defaults = UserDefaults() 
if !defaults.bool(forKey:"walkthroughShown") { 
    defaults.set(true, forKey:"walkthroughShown") 
    // Display your Walkthrough 
} 

viewDidLoadは、このコードのための場所として機能しません、あなたが提示するアプリのデリゲートにチュートリアルまたはあなたの最初のこのコードを使用して良いだろうビューコントローラ

+0

ありがとう、ウォークスルーを表示するためのコードは何でしょうか? UserDefaults.standard.register(デフォルト:defaultValues) アプリデリゲートと、その後のviewDidLoadで休息または1つのViewController – Ivan

0

あなたは最初の値のラップを解除する必要があります

if let isFirstStart = UserDefaults.standard.value(forKey: "isFirstLaunch") as? Bool { 
    // the isFirstStart value exists, you can check the value 
} else { 
    // the isFirstStart value does not exist 
} 

を、それが初めてではtrueにすることはできませんので、私は(それが以前に設定されていないので)、isFirstStartが悪い言葉遣い大会だと思います。たとえばhasStartedを使用してください。これは値が存在しないかどうかを示しています。存在していればそれ以前に開始されていません。

希望すると、お気軽にお問い合わせください。

関連する問題