【问题标题】:How to use NSTimer to fire off multiple times?如何使用 NSTimer 多次触发?
【发布时间】:2015-08-08 17:03:26
【问题描述】:

我有一个 RNG,希望它每三秒触发一次。到目前为止我有

var timer = NSTimer(timeInterval: 3, target: self , selector: randomnumbers, userInfo: nil, repeats: true)

func randomnumbers() {
    var rockNamesArray:[String] = ["bird", "rock2", "rock3"]

    var rockpos = Int(arc4random_uniform(UInt32(3)))
}

但是我有一堆错误消息,我不知道如何组织它。

编辑

此代码中的错误消息告诉我它有一个未解析的标识符“self”,而所有其他错误只是因为我更改了此代码而发生的错误,例如未解析的标识符 rockNamesArray 和 rockpos,它们在三个中发生了 4 次不同的代码行。

EDIT2

如评论中所述,上述代码放置在一个解释self 不起作用的类之外​​。但是在这种情况下如何处理定时器程序呢?

【问题讨论】:

  • 那么哪些错误信息?
  • 一般来说,我们不太关心将您的代码复制/粘贴到样板模板中以查看您遇到的错误。请在问题中将它们提供给我们。 (请注意,我在问题中说不要将它们发布在 cmets 中)
  • 在两阶段初始化的第一阶段为您的存储属性timer分配初始值时,您不能参考self。请查看The Swift Programming LanguageInitialization章节更多细节。

标签: swift nstimer


【解决方案1】:

试试这个:

var timer = NSTimer(timeInterval:3, target:self, selector:Selector("randomnumbers:"), userInfo: nil, repeats: true)

func randomnumbers(timer:NSTimer) {
    var rockNamesArray:[String] = ["bird", "rock2", "rock3"]

    var rockpos = Int(arc4random_uniform(UInt32(3)))
}

因为计时器例程需要一个计时器对象。

编辑您需要将它放在一个(虚拟)类中,如下所示:

class MyTimer {
  var timer: NSTimer
  init() {
    timer = NSTimer(timeInterval:3, target:self , selector:Selector("randomnumbers:"), userInfo:nil, repeats:true)
  }

  func randomnumbers(timer:NSTimer) {
    // ...
  }
}

let myTimer = MyTimer()

【讨论】:

  • 它表示使用未解析的标识符 self.我把它放在 viewcontroller 的外面,但是如果我把它放在 viewcontroller 类中,RNG 将无法工作。
  • 只是为了实例化您的计时器例程以便它可以运行。
【解决方案2】:

selector: "randomnumbers" 而不是selector: randomnumbers。您可以使用timer = NSTimer.scheduledTimerWithTimeInterval 而不是timer = NSTimer(timeInterval... 来实例化计时器并同时启动它。在您的控制器中调用它,例如在 viewDidLoad 中

还请注意,您的 randomnumbers() 不会做任何事情。你给rockpos赋值,但不要对它做任何事情。所以你将无法看到计时器是否在工作......

【讨论】:

  • 这可能不起作用,因为计时器例程需要一个计时器对象作为参数。
【解决方案3】:

它有一个未解析的标识符“self”

听起来您提供的代码不是实例方法的一部分。 self 是一个关键字,它指代正在执行其代码的对象。如果您没有对象,则没有self,因此会出现错误。要解决此问题,您可以将指针传递给具有 randomnumbers 选择器代替 self 的其他对象。

【讨论】:

    【解决方案4】:

    在 Swift 初始化的第一阶段完成之前,为每个存储的属性分配初始值时,不能将 self 引用为值。

    正如The Swift Programming Language 所说:

    Swift 中的类初始化是一个两阶段的过程。在第一阶段,每个存储的属性都由引入它的类分配一个初始值。一旦确定了每个存储属性的初始状态,第二阶段就开始了,每个类都有机会在新实例被认为可以使用之前进一步自定义其存储属性。

    在第一阶段初始化完成之前,初始化器不能调用任何实例方法、读取任何实例属性的值或将 self 作为值引用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-22
      • 1970-01-01
      • 1970-01-01
      • 2023-03-11
      相关资源
      最近更新 更多