2016-09-08 14 views
-2

我在我的智慧的結尾在這裏試圖弄清楚如何讓這個NSTimer工作。爲了清楚起見,粘貼我的整個代碼。重要的部分是粗體。2.2定時計時器返回「視圖控制器沒有成員...」

import UIKit 
import QuartzCore 
import Foundation 

class ViewController: UIViewController { 
@IBOutlet weak var outerCircle: UIImageView! 

@IBOutlet weak var innerCircle: UIImageView! 

@IBOutlet weak var instructionLabel: UILabel! 

override func viewDidLoad() { 
    super.viewDidLoad() 
    // Do any additional setup after loading the view, typically from a nib. 


    var timer: NSTimer! 


    timer = NSTimer.scheduledTimerWithTimeInterval(5, target: self, selector: #selector(ViewController.runTimedCode), userInfo: nil, repeats: true) 


    func runTimedCode() { 


     UIView.animateWithDuration(5, delay:0, options:[], animations: { 
      //Inhale 
      self.innerCircle.transform = CGAffineTransformMakeScale(3.5, 3.5) 
      self.instructionLabel.text = "Inhale" 

      }, completion: { finish in 
       //Exhale 
       UIView.animateWithDuration(5, delay:0, options:[], animations: { 

        self.innerCircle.transform = CGAffineTransformMakeScale(1, 1) 
        self.instructionLabel.text = "Exhale" 
        }, completion: nil) 
     }) 

    } 


} 

override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    // Dispose of any resources that can be recreated. 
    } 


} 

我想要的是在 「runTimedCode()」,以每10秒運行。我目前得到一個錯誤的:。

timer = NSTimer.scheduledTimerWithTimeInterval(5, target: self, selector: #selector(ViewController.runTimedCode), userInfo: nil, repeats: true) 

錯誤說「類型‘視圖控制器’沒有成員‘runTimedCode’

當我拿的ViewController的時候,我得到一個不同的錯誤:使用局部變量'runTimedCode'在它的聲明之前

最後,當我將該行移動到代碼的底部時,我得到了「#selector'的參數指的是一個未暴露給Objective-C的方法。

我覺得我已經誠實地嘗試了一切,讓這個計時器工作。我已經看過每一個可以想象的線程。我對計時器的功能有一些基本的誤解嗎?

+0

大家都是對的..這是因爲在另一個函數中放置了一個函數。我對這個真的很陌生,所以我爲這樣一個業餘的錯誤道歉。感謝您的幫助! –

回答

0

大家都是對的,你在viewDidLoad裏定義了你的runTimedCode函數,所以它在錯誤的範圍內。你也應該避免在完成塊內嵌套動畫。嘗試使用我爲您準備的代碼。

import Foundation 

class ViewController: UIViewController { 

    // MARK: Outlets 

    @IBOutlet weak var outerCircle: UIImageView! 
    @IBOutlet weak var innerCircle: UIImageView! 
    @IBOutlet weak var instructionLabel: UILabel! 

    // MARK: Properties 

    var timer: NSTimer? 

    // MARK: Lifecycle 

    override func viewDidLoad() { 

     super.viewDidLoad() 

     timer = NSTimer.scheduledTimerWithTimeInterval(5, 
      target: self, 
      selector: #selector(timerDidFinish), 
      userInfo: nil, 
      repeats: true 
     ) 
    } 

    // MARK: NSTimer 

    func timerDidFinish() { 

     UIView.animateWithDuration(5, delay: 0, options: [.Autoreverse], animations: { 
      self.innerCircle.transform = CGAffineTransformMakeScale(3.5, 3.5) 
      self.instructionLabel.text = "Inhale" 
     }, completion: nil) 
    } 
} 
+0

我愛你。非常感謝。 –

+0

不客氣! – Callam

4

問題是,你已經把func runTimedCode() {...}裏面另一個功能,viewDidLoad。你不能那樣做。把它放在視圖控制器的頂層。

2

您的viewcontroller沒有runTimedCode方法。

你在viewDidLoad函數中聲明它,你應該將它移到外面。