【问题标题】:NSTimer call function from superclass来自超类的 NSTimer 调用函数
【发布时间】:2016-05-24 19:10:23
【问题描述】:

假设我有一个用作计时器的 Timer 类。

我希望所有其他可以像计时器一样工作的类都具有 Timer 类型的属性。

问题是:Timer 类使用了 NSTimer 属性,我不知道如何将 Timer 外部的函数关联到其中。

例如:A类有属性B,即Timer。 scheduleTimerWithTimerInterval 怎么调用A的某个函数?

这里是计时器:

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

这里是 ViewController:

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:一开始是Selector("Stop")

【问题讨论】:

    标签: ios swift nstimer


    【解决方案1】:

    不是"self.t",您提供的对象是目标。选择器类似于"ViewController.t" 或"t"。您还需要更改 Start 以获取目标对象。

    移动到 Xcode 7.3.1 并尽可能使用新的选择器语法——它将被类型检查。

    【讨论】:

    • 我该怎么做?我应该向 Start(var vc: ViewController) 添加参数并使用 Selector("vc.t") 吗?
    • 我认为 Start 应该有一个目标和一个选择器。选择器可以是“t”或“ViewController.t”,绝对不是“vc.t”——“vc”是计时器完全不知道的变量的名称——选择器应用于您的对象作为目标传入。
    猜你喜欢
    • 1970-01-01
    • 2015-05-18
    • 1970-01-01
    • 2012-08-18
    • 1970-01-01
    • 2013-12-25
    • 1970-01-01
    • 1970-01-01
    • 2012-04-08
    相关资源
    最近更新 更多