Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何使用Swift在ViewController中继续执行功能?_Ios_Swift_Nstimer_Viewcontroller - Fatal编程技术网

Ios 如何使用Swift在ViewController中继续执行功能?

Ios 如何使用Swift在ViewController中继续执行功能?,ios,swift,nstimer,viewcontroller,Ios,Swift,Nstimer,Viewcontroller,我有一个NSTimer(),它从单击按钮开始。如果我想在标签上显示计时器,我可以在同一个视图控制器中执行此操作,但我希望计时器继续运行,并在下一个视图控制器上显示值(1…2…3)。我有一个标签,在下一个视图控制器上显示时间变量,但它仅在按下按钮时显示时间变量的值,并且不会继续。传递了时间变量,但未传递运行该变量的函数。我该怎么做呢 var timer = NSTimer() var time = 0 内部视图加载: timer = NSTimer.scheduledTimerWithTime

我有一个NSTimer(),它从单击按钮开始。如果我想在标签上显示
计时器
,我可以在同一个视图控制器中执行此操作,但我希望计时器继续运行,并在下一个视图控制器上显示值(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。