通过NSTimer - swift在ViewDidLoad中调用函数

时间:2015-04-21 10:31:02

标签: ios function swift nstimer bezier

我试图在swift中为一些bezier路径设置动画,我需要让它们中的一些在设置延迟后启动。为此,我必须在viewDidLoad函数中编写这两组代码。

以下是一些具有相同想法的示例代码:

override func viewDidLoad() {
    super.viewDidLoad
    func testFunc() {
        println("Hello")
    }

    var frontOfBaseTimer = NSTimer.scheduledTimerWithTimeInterval(3, target: self, selector: Selector("testFunc"), userInfo: nil, repeats: false)
}

这会在加载视图3秒后使应用程序崩溃。错误消息让我相信在这种情况下唯一的问题是目标属性。

我应该在这里做些什么才能让它发挥作用?

4 个答案:

答案 0 :(得分:1)

如果您已经绑定并决定使用自己的延迟循环,请考虑使用GCD和dispatch_after方法。该方法接受一个闭包并在指定的延迟后调用闭包,这几乎就是你想要的。您将为队列参数传递nil,因此您的闭包将在主队列上运行。

我创建了一个全局函数延迟,让我可以轻松地调用dispatch_async,而不必弄清楚它的混乱参数:

func delay(delay: Double, block:()->())
{
  let nSecDispatchTime = dispatch_time(DISPATCH_TIME_NOW, 
    Int64(delay * Double(NSEC_PER_SEC)));
  let queue = dispatch_get_main_queue()

  dispatch_after(nSecDispatchTime, queue, block)
}

你这样称呼它:

delay(2.0)
{
   //code to fire after a delay
}

答案 1 :(得分:0)

这样做,你的应用程序崩溃,因为,计时器调用已在viewdidload方法中添加的函数。

override func viewDidLoad() {
    super.viewDidLoad()

    var frontOfBaseTimer = 
       NSTimer.scheduledTimerWithTimeInterval(3, 
                                              target: self, 
                                              selector: Selector("testFunc"), 
                                              userInfo: nil, 
                                              repeats: false)
}

func testFunc() {
    println("Hello")
}

答案 2 :(得分:0)

试试这个: -

 override func viewDidLoad() {
    super.viewDidLoad()

    var frontOfBaseTimer = 
       NSTimer.scheduledTimerWithTimeInterval(3, 
                                              target: self, 
                                              selector:"testFunc", 
                                              userInfo: nil, 
                                              repeats: false)
}

func testFunc(){
    println("hello its me")
}

答案 3 :(得分:0)

我刚刚对其进行了测试,并确认您无法使用嵌套函数作为NSTimer的选择器。定时器调用的方法需要在目标的全局范围内定义。

如果您正在尝试制作动画,为什么不使用UIView动画?该系列方法包括延迟参数。

您也可以使用Core Animation。通过将bezierPath中的CGPath安装到形状图层中,然后将形状图层的路径更改为CABasicAnimation的一部分,可以非常轻松地为路径设置动画。

使用Core Animation可以制作非常流畅,干净的动画。

我在Github上有一个名为RandomBlobs的项目,它展示了如何使用CAShapeLayers和CABasicAnimations为Bezier路径设置动画。它是用Objective-C编写的,但这些技术直接适用于Swift。

您可以看到short video of the bezier path animation on Youtube