Ios 如何使用Swift在ViewController中继续执行功能?
我有一个NSTimer(),它从单击按钮开始。如果我想在标签上显示Ios 如何使用Swift在ViewController中继续执行功能?,ios,swift,nstimer,viewcontroller,Ios,Swift,Nstimer,Viewcontroller,我有一个NSTimer(),它从单击按钮开始。如果我想在标签上显示计时器,我可以在同一个视图控制器中执行此操作,但我希望计时器继续运行,并在下一个视图控制器上显示值(1…2…3)。我有一个标签,在下一个视图控制器上显示时间变量,但它仅在按下按钮时显示时间变量的值,并且不会继续。传递了时间变量,但未传递运行该变量的函数。我该怎么做呢 var timer = NSTimer() var time = 0 内部视图加载: timer = NSTimer.scheduledTimerWithTime
计时器
,我可以在同一个视图控制器中执行此操作,但我希望计时器继续运行,并在下一个视图控制器上显示值(1…2…3)。我有一个标签,在下一个视图控制器上显示时间变量,但它仅在按下按钮时显示时间变量的值,并且不会继续。传递了时间变量,但未传递运行该变量的函数。我该怎么做呢
var timer = NSTimer()
var time = 0
内部视图加载:
timer = NSTimer.scheduledTimerWithTimeInterval(1, target: self, selector: Selector("timerFunc"), userInfo: nil, repeats: true)
func timerFunc() {
time++
//time label displays the time (1..2...3 etc)
timeLabel.text = String(time)
}
SecondSceneViewController具有从该视图控制器传递的时间变量:
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
var secondScene = segue.destinationViewController as!
SecondViewController
secondScene.time = time
}
当我转到secondViewController时,时间变量中的值与按下按钮时的时间变量相同,并且它不会继续运行。如何将计时器传递给下一个视图控制器以显示值?在我看来,您应该将计时器的代码提取到中,然后从两个视图控制器访问它 这里有一个简单的开始:
class TimerManager {
var realSharedInstance: TimerManager?
var sharedInstance: TimerManager {
get{
if let realSharedInstance = realSharedInstance {
return realSharedInstance
}
else{
realSharedInstance = TimerManager()
return realSharedInstance!
}
}
}
var timer: NSTimer
init() {
timer = NSTimer()
}
func rest() {
timer = NSTimer()
}
}如果保留这两个变量
var timer = NSTimer()
var time = 0
在类之外,它们成为全局的,您可以从另一个视图控制器访问它们
像这个例子:
import UIKit
import CoreData
var fromJSON = true
// Retreive the managedObjectContext from AppDelegate
let managedObjectContext = (UIApplication.sharedApplication().delegate as! AppDelegate).managedObjectContext
class CoreDataController: UIViewController {
另一种选择是使用通知中心:
NSNotificationCenter.defaultCenter().addObserver(
self,
selector: "batteryLevelChanged:",
name: UIDeviceBatteryLevelDidChangeNotification,
object: nil)
@objc func batteryLevelChanged(notification: NSNotification){
//do stuff
}
我将创建一个处理计时器事件的单例
let myTimerNotificationNameKey = "timerKey"
let myTimerNotificationUserInfoTimeKey = "timerUserInfoKey"
class myTimer {
static let sharedInstance = myTimer()
var timer: NSTimer
var time = 0
func startTimer() {
time = 0
timer = NSTimer.scheduledTimerWithTimeInterval(1, target: self, selector: "timerFunc:", userInfo: nil, repeats: true)
}
func stopTimer() {
timer.invalidate()
timer = nil
}
func timerFunc(timer: NSTimer) {
NSNotificationCenter.defaultCenter().postNotificationName(myTimerNotificationNameKey,object: nil, userInfo: {myTimerNotificationUserInfoTimeKey: time++})
}
}
在第一个视图控制器上,调用将启动计时器的函数myTimer.sharedInstance.startTimer()。但首先要记住听通知。通知将收到带有时间计数的用户信息字典。在第二个视图控制器上执行相同的操作
现在您有了一个可以跨多个视图控制器侦听的计数。一旦你不再需要计时器,记得停止它
注意:我还没有编译这段代码。@carlos-e-hernandez,你如何继续?您将在何处初始化myTimer类?@boehmatron myTimer类可以使用sharedInstance
static方法访问,该方法使该类成为单例。你可以在任何地方访问它。不是最好的设计,但解决了OP的问题。另一种解决方案是使用依赖注入,拥有一个类自己的myTimer,然后在每个需要访问它的视图控制器上注入myTimer。