2014-12-29 54 views
5

我ViewController.swift暂停计时器时应用程序是在后台状态斯威夫特

func startTimer() { 
timer = NSTimer().scheduleTimerWithTimerInvterval(1.0,target: self,selctor: Selector("couting"),userinfo: nil, repeats: true) 
} 
func pauseTimer() { 
timer.invalidate() 
println("pausing timer") 
} 

,这是appDelegate.swift

func applicateWillResignActive(application: UIApplication) { 
viewController().pauseTimer() 
println("closing app") 
} 

正在打印暂停定时器和关闭应用程序但是当我打开我再次看到它永不停歇。我如何正确地做到这一点?

+0

试试这个控制,希望这会对你有帮助。 https://www.cocoacontrols.com/controls/game-timer –

+0

,当应用程序处于后台状态时不会暂停 – user528432

回答

22

你必须设置一个观察者监听应用程序何时进入后台。在ViewController的viewDidLoad()方法中添加下面的代码行。

NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("myObserverMethod:"), name:UIApplicationDidEnterBackgroundNotification, object: nil) 

添加以下函数以接收通知。

func myObserverMethod(notification : NSNotification) { 
    println("Observer method called") 

    //You may call your action method here, when the application did enter background. 
    //ie., self.pauseTimer() in your case. 
} 

快乐编码!在斯威夫特3

+0

这是完美的苏雷什,我必须创建一个新的观察员,当用户回来,所以我可以恢复计时器? – user528432

+0

是的,你必须创建另一个观察者来监听UIApplicationDidBecomeActiveNotification,同样你也可以像上面指定的那样调用观察者内部的动作。 – Suresh

+0

太棒了!当用户再次进入然后恢复计时器时,我创建了相同的func。它的工作很好(y) – user528432

0

您正在创建一个新的对象,并对其调用pauseTimer()

viewController().pauseTimer() // This line causes issue viewController(), creates a new instance 

而不是创建新的对象,无论是你应该是实例传递给AppDelegate中并调用pauseTimer()现有的对象或侦听UIApplicationDidEnterBackgroundNotification通知在你的视图控制器类和暂停计时器从那里。

+0

尝试但它只是“println(”暂停计时器“)”并且不停止计时器 – user528432

+0

@djay:你是怎么通过这个对象的?请再次阅读我的答案 –

+0

最新** ** ApplicationWillEnterBackground **的正确代码是什么? – user528432

1

接受的答案被@Suresh设置一个观察者听,当应用程序确实在你的ViewController的viewDidLoad()方法进入背景

NotificationCenter.default.addObserver(self, selector: #selector(myObserverMethod), name:NSNotification.Name.UIApplicationDidEnterBackground, object: nil) 

添加以下函数以接收通知。

func myObserverMethod(notification : NSNotification) { 

    print("Observer method called") 

    //You may call your action method here, when the application did enter background. 
    //ie., self.pauseTimer() in your case. 

}