2016-09-08 8 views
-2

このNSTimerを動作させる方法を理解しようとしています。私のコード全体を明瞭にするために貼り付ける。重要な部分は太字です。2.2スケジュールされたタイマーが返す「View Controllerにはメンバーがありません...」

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. 
    } 


} 

私は10秒ごとに実行する "runTimedCode()" であるものをしたいです。私は現在、上のエラーを取得しています:。。「タイプ 『のViewControllerが』いいえメンバー 『runTimedCode』を持っていないエラーが言う

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

を私はViewControllerをを取るときに出て、私は別のエラーを取得する:の使用をローカル変数 'runTimedCode'の宣言の前に

最後に、その行をコードの最後に移動すると、「#selectorの引数」はObjective-Cに公開されていないメソッドを参照します。

このタイマーを稼働させるために正直にすべてを試したような気がします。私は想像できるすべてのスレッドを見てきました。タイマーの機能に関する基本的な誤解がありますか?

+0

誰もが正しくありました。これは、別の関数内に関数を配置したためです。私は本当にこれに新しいので、私はそのような素人間違いのために謝罪します。ご協力ありがとうございました! –

答えて

0

誰もが正しく、あなたの関数をviewDidLoadの中に定義しているので、間違った範囲に入っています。また、完成ブロック内にアニメーションを入れ子にしないでください。私があなたのために準備したコードを使ってみてください。

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関数内で宣言しているので、外に移動する必要があります。

関連する問題