2016-12-06 3 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 
} 

Вот мой первоначальный контроллер. Это приводит к сбою моего приложения в свойстве currentDateBool, потому что оно равно нулю. Тем не менее, он не должен быть нулевым, поскольку он устанавливает значение true в AppDelegate. Я думал, что 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

я могу заставить его работать, если я перееду установку currentDateBool свойства пользователя по умолчанию в viewDidLoad

Именно так. И это именно то, что вы должны делать.

Вы используете основную раскадровку. Это означает, что ваш начальный интерфейс загружается из раскадровки, до запускается код в вашем 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")}() 
} 

Вы увидите two, то one в консоли.

Но если вы переместите what в viewDidLoad, вы увидите one, затем two. Это связано с тем, что в этой ситуации вид контроллера вида не загружается до после ваш код в делете делегата приложения.

+0

Спасибо, имеет смысл! – chickenparm

Смежные вопросы