我正在使用 Swift制作小费计算器应用程序.我的目标是在10分钟后重置我的应用程序(换句话说,将我的所有标签设置为0.00美元并在NSUserDefaults中设置默认值).
我将这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的所有变量都变为nil并且出现错误
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)
}
最佳答案 您的问题是当您说ViewController().closeApp()时,您正在分配ViewController的新实例并在该实例上调用closeApp函数.由于您没有从故事板中实例化该实例,因此没有附加任何插件,您将获得零引用异常.
您需要在现有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()
}
}