2016-01-01 7 views
4

Я делаю приложение калькулятора чата с помощью Swift. Моя цель - сбросить мое приложение через 10 минут (другими словами, установить все мои ярлыки до $ 0.00 и установить значения по умолчанию в NSUserDefaults).Сброс Быстрое приложение через 10 минут

я эти 3 функции в моем ViewController.swift файле:

func compareTimes(opens: NSDate?, closes: NSDate?) { 
    if(opens!.timeIntervalSinceReferenceDate-closes!.timeIntervalSinceReferenceDate>600) { 
     reset() 
    } 
} 
func openApp() { 
    openingTime = NSDate() 
    let defaults = NSUserDefaults.standardUserDefaults() 
    closingTime = defaults.objectForKey(closeKey) as! NSDate? 
    if (closingTime != nil) { 
     compareTimes(openingTime, closes: closingTime) 
    } 
} 

func closeApp() { 
    closingTime = NSDate() 
    let defaults = NSUserDefaults.standardUserDefaults() 
    defaults.setObject(closingTime, forKey: closeKey) 
} 

В моей AppDelegate я называю два из этих методов:

func applicationDidEnterBackground(application: UIApplication) { 
    // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. 
    // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. 
    ViewController().closeApp() 
} 

func applicationWillEnterForeground(application: UIApplication) { 
    // Called as part of the transition from the background to the active state; here you can undo many of the changes made on entering the background. 
    ViewController().openApp() 
} 

Обратите внимание, что, когда приложение закрыто время и когда приложение открыто, время также записывается. Эти времена сравниваются, и если вызывается 10 минут reset().

Моя проблема когда reset() называется все мои переменные, которые представляют UILabels и UITextFields становятся нулевыми, и я получаю сообщение об ошибке

fatal error: unexpectedly found nil while unwrapping an Optional value.

Вот мой reset() метод для справки:

func reset() { 
    billField.text="" 
    tipLabel.text = "+ "+formatter.stringFromNumber(0)! 
    totalLabel.text = formatter.stringFromNumber(0) 
    total2.text = formatter.stringFromNumber(0) 
    total3.text = formatter.stringFromNumber(0) 
    total4.text = formatter.stringFromNumber(0) 

    let defaults = NSUserDefaults.standardUserDefaults() 
    defaults.setObject("15", forKey: key1) 
    defaults.setObject("18", forKey: key2) 
    defaults.setObject("20", forKey: key3) 
    defaults.synchronize() 
    percentages.append(0.1) 
    percentages.append(0.1) 
    percentages.append(0.1) 
    percentButton.setTitle("15%", forSegmentAtIndex: 0) 
    percentButton.setTitle("18%", forSegmentAtIndex: 1) 
    percentButton.setTitle("20%", forSegmentAtIndex: 2) 
} 

ответ

1

Ваша проблема заключается в том, что когда вы говорите ViewController().closeApp(), вы назначаете новый экземпляр ViewController и вызываете closeApp функция на этом экземпляре. Поскольку вы не создаете экземпляр этого экземпляра из своей раскадровки, ни один из выходов не подключен, и вы получаете исключение ссылки nil.

Вам необходимо вызвать методы в существующем экземпляре ViewController. Вы можете использовать что-то вроде этого:

func applicationDidEnterBackground(application: UIApplication) { 
    // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. 
    // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. 
    if let viewController = application.keyWindow?.rootViewController as? ViewController { 
     viewController.closeApp() 
    } 
} 


func applicationWillEnterForeground(application: UIApplication) { 
    // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background. 
    if let viewController = application.keyWindow?.rootViewController as? ViewController { 
     viewController.closeApp() 
    } 
} 
+0

Как вы создаете экземпляр из раскадровки? Я попробовал ваше предложение, но теперь он не вызывает методы closeApp() и openApp(). – Aloysius

+0

Это все равно вам не поможет - вам нужен экземпляр, который находится на экране. Если мой код не запущен, это, вероятно, означает, что условное downcast не работает, и поэтому текущий контроллер представления не является ViewController. Установите точку останова и посмотрите, что происходит. Или, поскольку вы сохраняете все свои значения в NSUserDefaults, просто переместите код с контроллера представления на методы делегирования приложения, а затем перезагрузите значения по умолчанию в 'viewWillAppear' – Paulw11

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