我正在使用Swift制作小费计算器应用程序。我的目标是在10分钟后重置我的应用程序(换句话说,将我的所有标签设置为$ 0.00并将默认值设置回NSUserDefaults
)。
我把这三个函数放在我的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并且我收到错误
致命错误:在解包可选值时意外发现nil。
以下是我的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)
}
答案 0 :(得分:1)
您的问题是,当您说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()
}
}