2016-05-24 2 views
2

私はタイマーとして動作するクラスTimerを持っているとしましょう。スーパークラスのNSTimerコール関数

タイマーのように動作することができる他のすべてのクラスに、タイマータイプの属性が必要です。

問題は、TimerクラスがNSTimer属性を使用していて、タイマーの外部から関数を関連付ける方法がわかりません。

たとえば、クラスAには属性B(Timer)があります。 scheduledTimerWithTimerIntervalはどのようにAの関数を呼び出すことができますか? ViewControllerを

ここ
import UIKit 
class Timer{ 

    var interval: NSTimeInterval! 
    var counting: Bool = false 
    var numberOfTouches: Int = 0 
    private var timer: NSTimer = NSTimer() 

    init(interval: CGFloat){ 
     self.interval = NSTimeInterval(interval) 
     self.counting = false 
    } 

    func Start(function: String) { 
     if(self.counting){ 
      self.numberOfTouches += 1 
      self.timer.invalidate() 
      self.timer = NSTimer.scheduledTimerWithTimeInterval(self.interval, target: self, selector: Selector(function), userInfo: nil, repeats: false) 
     } 
     else{ 
      self.counting = true 
      self.numberOfTouches = 1 
     } 
    } 

    func Stop(){ 
     if(!self.counting){ 
      self.counting = false 
     } 
    } 
} 

は次のとおりです:ここで

はタイマーで最後に

import UIKit 

class ViewController: UIViewController { 

    var timer: Timer = Timer(interval: 1.0) 

    override func viewDidLoad() { 
     super.viewDidLoad() 
    } 

    @IBAction func Trigger(sender: AnyObject) { 
     //yes, this doesn't call t() from the ViewController 
     timer.Start("self.t") 

    } 

    func t(){ 
     label.text = String(timer.numberOfTouches) 
    } 

    @IBOutlet weak var label: UILabel! 

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


} 

、このタイマーが何をしようとするものである:

  • 私はボタンを押す

    、それカウントを開始し、タッチ数を1に設定します。
  • 触れてから1秒以内にもう一度押すと、1秒タイマーが再起動し、タッチが1増加します。
  • 触れずに1秒後、ViewControllerからt()を呼び出してラベルを最後のタッチ数に設定する必要があります。

これを解決するにはどうすればよいですか?

ありがとうございました!

PS:初めに、それはそれは、あなたがターゲットとして、オブジェクトを供給しない"self.t"のselector( "停止")

答えて

0

でした。セレクタは"ViewController.t"または"t"のようなものです。ターゲットオブジェクトを取得するには、Startを変更する必要があります。

Xcode 7.3.1に移動し、可能であれば新しいセレクタ構文を使用してください。これはタイプチェックされます。

+0

どうすればいいですか? Start(var vc:ViewController)にパラメータを追加し、Selector( "vc.t")を使用する必要がありますか? – Daniel

+0

私はスタートがターゲットとセレクタを取るべきだと思います。セレクタは "t"または "ViewController.t"のいずれかであり、間違いなく "vc.t"ではありません。 - "vc"はTimerにとってまったく知られていない変数の名前です。セレクタはオブジェクトに適用されますターゲットとして渡す。 –

関連する問題