2016-12-06 11 views
0

AppDelegate関数の前または後に初期ビューコントローラのプロパティが設定されますかdidFinishLaunchingWithOptionsが呼び出されますか?プロパティがユーザーにリンクされているためにアプリケーションがクラッシュする

ここにAppDelegateのコードがあります。私のアプリが最初に起動したときに、 "CurrentDateBool"のユーザーデフォルトが設定されていない場合、trueに設定されます。

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { 

    if UserDefaults.standard.value(forKey: "currentDateBool") == nil { 
     UserDefaults.standard.setValue(true, forKey: "currentDateBool") 
    } 
    return true 
} 

ここに私の最初のView Controllerがあります。これは、nilであるため、currentDateBoolプロパティでアプリケーションをクラッシュさせます。ただし、AppDelegateでtrueに設定されているので、この値はゼロであってはなりません。私は、AppDelegateが最初のビューコントローラの前に設定されると考えました。誰かがプロパティが設定される順序を明確にしてもらえますか?

class TimestampTableViewController: UITableViewController { 

    var currentDateBool = UserDefaults.standard.value(forKey: "currentDateBool") as! Bool 

    override func viewDidLoad() { 
    super.viewDidLoad() 
    } 
... 
} 

currentDateBoolプロパティをviewDidLoadのユーザーデフォルトに設定すると、動作するようになります。

class TimestampTableViewController: UITableViewController { 

    var currentDateBool = true 

    override func viewDidLoad() { 
    super.viewDidLoad() 
    currentDateBool = UserDefaults.standard.value(forKey: "currentDateBool") as! Bool 
    } 
... 
} 
+0

"currentDateBoolプロパティをviewDidLoadのユーザーの既定値に設定すると、動作させることができます。"そう! – matt

+0

@mattしました!ハハ。私は、なぜ私がしないときにそれがクラッシュしているのか理解しようとしています。私はプロパティが設定される前にAppDelegateが呼び出されると思ったので、クラッシュする理由を理解できません。 – chickenparm

+0

TimestampTableViewControllerはルートビューコントローラですか?メインのストーリーボードを使用していますか? – matt

答えて

0

私はまさにそうviewDidLoad

におけるユーザーのデフォルトにcurrentDateBoolプロパティを設定移動した場合、私はそれが仕事を得ることができます。そしてそれはあなたがすべきことです。

メインのストーリーボードを使用しています。つまり、didFinishLaunchingWithOptionsのコードがの前に、ストーリーボードの初期インターフェイスが読み込まれていることを意味します。したがって、TimestampTableViewControllerはまだビューを持っていませんが、が存在します - インスタンス化されており、そのプロパティに初期値が与えられていることを意味します。

// in the app delegate 

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { 
    print("one") 
    return true 
} 

// in the main view controller 

class ViewController: UIViewController { 
    let what : Void = {print("two")}() 
} 

あなたは、コンソールで、その後twooneが表示されます。ちょうどこのように、基本的なバニラのプロジェクトを作成し、これが真実であることを確認するには

whatviewDidLoadに移動すると、one、次にtwoと表示されます。この状況では、ビューコントローラのビューまでロードされず、のコードの後に​​アプリケーションデリゲートが実行されるためです。

+0

ありがとうございます! – chickenparm

関連する問題