Итак, я создаю простое приложение для iOS, используя Swift. Мне нужно убить мой NSTimer
после входа приложения в фоновый режим и создать новый после того, как приложение снова станет активным.
Первоначально мое решение состоит в том, чтобы создать таймер класса NSTimer
в ViewDidLoad()
в основном файле контроллера. И это вызывает ошибку в моем приложении.
Думаю, мне нужно отключить таймер, используя applicationDidEnterBackground()
в AppDelegate.swift. Но я не совсем уверен, как это сделать. Должен ли я создать класс таймера в AppDelegate.swift или в основном контроллере? Я не знаю, как файлы Swift разделяют классы.
Я искал в Интернете решения, но все эти сообщения слишком старые, решения написаны на Objective-C.
Я совсем новичок. Поэтому я надеюсь, что кто-то может объяснить это на Swift.
Вот код в моем основном контроллере TodoTableViewController.swift:
import UIKit
import CoreData
class TodoTableViewController: UITableViewController, NSFetchedResultsControllerDelegate {....
...
...
override func viewDidLoad() {
super.viewDidLoad()
var fetchRequest = NSFetchRequest(entityName: "Todo")
let sortDescriptor = NSSortDescriptor(key: "dayleft", ascending: true)
fetchRequest.sortDescriptors = [sortDescriptor]
if let managedObjectContext = (UIApplication.sharedApplication().delegate as AppDelegate).managedObjectContext {
fetchResultController = NSFetchedResultsController(fetchRequest:fetchRequest, managedObjectContext: managedObjectContext, sectionNameKeyPath: nil, cacheName: nil)
fetchResultController.delegate = self
var e: NSError?
var result = fetchResultController.performFetch(&e)
todos = fetchResultController.fetchedObjects as [Todo]
if result != true {
println(e?.localizedDescription)
} }
var timer = NSTimer.scheduledTimerWithTimeInterval(10, target: self, selector:"update", userInfo:nil, repeats: true)
}
...
}
Если я собираюсь аннулировать таймер в AppDelegate.swift, как я могу сослаться на таймер, созданный в TodoTableViewController.swift? Или, может быть, мне следует поместить весь код, связанный с таймером, в AppDelegate.swift?
обновить
Я пытался использовать NSNotificationCenter, вот мой код.
import UIKit
import CoreData
class TodoTableViewController: UITableViewController, NSFetchedResultsControllerDelegate {
...
var timer = NSTimer.scheduledTimerWithTimeInterval(10, target: self, selector:"viewDidLoad", userInfo:nil, repeats: true)
func update(){
.....
}
override func viewDidLoad() {
super.viewDidLoad()
...
let notificationCenter = NSNotificationCenter.defaultCenter()
notificationCenter.addObserver(self, selector: "didEnterBackground", name: "UIApplicationDidEnterBackgroundNotification", object: UIApplication.sharedApplication())
notificationCenter.addObserver(self, selector: "didBecomeActive", name: "UIApplicationWillEnterForegroundNotification", object: UIApplication.sharedApplication())
}
func didEnterBackground() {
timer.invalidate()
}
func didBecomeActive() {
var timer = NSTimer.scheduledTimerWithTimeInterval(10, target: self, selector:"update", userInfo:nil, repeats: true)
}
...
}
Поскольку таймер объявлен в didBecomeActive()
, в didEnterBackground()
возникает ошибка: нет члена с именем "timer". Если я объявлю timer
вне didBecomeActive()
, как в коде, который я разместил выше, появится сообщение об ошибке «Дополнительный аргумент« селектор »в вызове». Я уже разбираю функцию update()
на селектор. Я не знаю, откуда эта ошибка.
UIApplicationDidEnterBackgroundNotification
иUIApplicationWillEnterForegroundNotification
через NSNotificationCenter. - person Paulw11   schedule 13.12.2014applicationDidEnterBackground(application: UIApplication)
иapplicationDidBecomeActive(application: UIApplication)
. - person Christian Di Lorenzo   schedule 13.12.2014