use*_*917 246 nstimer nstimeinterval ios swift
我试过了
var timer = NSTimer()
timer(timeInterval: 0.01, target: self, selector: update, userInfo: nil, repeats: false)
Run Code Online (Sandbox Code Playgroud)
但是,我说错了
'(timeInterval: $T1, target: ViewController, selector: () -> (), userInfo: NilType, repeats: Bool) -> $T6' is not identical to 'NSTimer'
Run Code Online (Sandbox Code Playgroud)
Osc*_*ros 522
这将有效:
override func viewDidLoad() {
super.viewDidLoad()
// Swift block syntax (iOS 10+)
let timer = Timer(timeInterval: 0.4, repeats: true) { _ in print("Done!") }
// Swift >=3 selector syntax
let timer = Timer.scheduledTimer(timeInterval: 0.4, target: self, selector: #selector(self.update), userInfo: nil, repeats: true)
// Swift 2.2 selector syntax
let timer = NSTimer.scheduledTimerWithTimeInterval(0.4, target: self, selector: #selector(MyClass.update), userInfo: nil, repeats: true)
// Swift <2.2 selector syntax
let timer = NSTimer.scheduledTimerWithTimeInterval(0.4, target: self, selector: "update", userInfo: nil, repeats: true)
}
// must be internal or public.
@objc func update() {
// Something cool
}
Run Code Online (Sandbox Code Playgroud)
对于Swift 4,您希望获取选择器的方法必须公开给Objective-C,因此@objc
必须将属性添加到方法声明中.
Sur*_*gch 144
您可以使用计时器多次执行操作,如以下示例所示.计时器调用一种方法每半秒更新一次标签.
这是代码:
import UIKit
class ViewController: UIViewController {
var counter = 0
var timer = Timer()
@IBOutlet weak var label: UILabel!
// start timer
@IBAction func startTimerButtonTapped(sender: UIButton) {
timer.invalidate() // just in case this button is tapped multiple times
// start the timer
timer = Timer.scheduledTimer(timeInterval: 0.5, target: self, selector: #selector(timerAction), userInfo: nil, repeats: true)
}
// stop timer
@IBAction func cancelTimerButtonTapped(sender: UIButton) {
timer.invalidate()
}
// called every time interval from the timer
func timerAction() {
counter += 1
label.text = "\(counter)"
}
}
Run Code Online (Sandbox Code Playgroud)
您还可以使用计时器在将来的某个时间安排一次性事件.与上述示例的主要区别在于您使用repeats: false
而不是true
.
timer = Timer.scheduledTimer(timeInterval: 2.0, target: self, selector: #selector(delayedAction), userInfo: nil, repeats: false)
Run Code Online (Sandbox Code Playgroud)
上面的示例调用delayedAction
在设置计时器后两秒钟命名的方法.它不会重复,但timer.invalidate()
如果您需要在事件发生之前取消该事件,您仍然可以打电话.
igr*_*ech 30
更新到Swift 4,利用userInfo:
class TimerSample {
var timer: Timer?
func startTimer() {
timer = Timer.scheduledTimer(timeInterval: 5.0,
target: self,
selector: #selector(eventWith(timer:)),
userInfo: [ "foo" : "bar" ],
repeats: true)
}
// Timer expects @objc selector
@objc func eventWith(timer: Timer!) {
let info = timer.userInfo as Any
print(info)
}
}
Run Code Online (Sandbox Code Playgroud)
Jos*_*ann 27
从iOS 10开始,还有一个新的基于块的Timer工厂方法,它比使用选择器更清晰:
_ = Timer.scheduledTimer(withTimeInterval: 5, repeats: false) { timer in
label.isHidden = true
}
Run Code Online (Sandbox Code Playgroud)
onm*_*133 21
Swift 3,iOS 10之前
func schedule() {
DispatchQueue.main.async {
self.timer = Timer.scheduledTimer(timeInterval: 20, target: self,
selector: #selector(self.timerDidFire(timer:)), userInfo: nil, repeats: false)
}
}
@objc private func timerDidFire(timer: Timer) {
print(timer)
}
Run Code Online (Sandbox Code Playgroud)
Swift 3,iOS 10+
DispatchQueue.main.async {
self.timer = Timer.scheduledTimer(withTimeInterval: 20, repeats: false) { timer in
print(timer)
}
}
Run Code Online (Sandbox Code Playgroud)
笔记
@objc
Mid*_* MP 17
检查:
var timer = NSTimer.scheduledTimerWithTimeInterval(0.01, target: self, selector: Selector("update"), userInfo: nil, repeats: true)
Run Code Online (Sandbox Code Playgroud)
Ond*_*sky 11
你需要在Swift 3中使用Timer而不是NSTimer.
这是一个例子:
Timer.scheduledTimer(timeInterval: 1,
target: self,
selector: #selector(YourController.update),
userInfo: nil,
repeats: true)
// @objc selector expected for Timer
@objc func update() {
// do what should happen when timer triggers an event
}
Run Code Online (Sandbox Code Playgroud)
迅捷5
我个人更喜欢带有封闭块的Timer:
Timer.scheduledTimer(withTimeInterval: 1, repeats: false) { (_) in
// TODO: - whatever you want
}
Run Code Online (Sandbox Code Playgroud)
对于swift 3和Xcode 8.2(很高兴有块,但如果你为iOS9编译并想要userInfo):
...
self.timer = Timer(fireAt: fire,
interval: deltaT,
target: self,
selector: #selector(timerCallBack(timer:)),
userInfo: ["custom":"data"],
repeats: true)
RunLoop.main.add(self.timer!, forMode: RunLoopMode.commonModes)
self.timer!.fire()
}
func timerCallBack(timer: Timer!){
let info = timer.userInfo
print(info)
}
Run Code Online (Sandbox Code Playgroud)
首先声明你的计时器
var timer: Timer?
Run Code Online (Sandbox Code Playgroud)
然后在 viewDidLoad() 或要启动计时器的任何函数中添加行
timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(action), userInfo: nil, repeats: false)
Run Code Online (Sandbox Code Playgroud)
这是您将回调它以执行某些操作的函数,它必须是@objc
@objc func action () {
print("done")
}
Run Code Online (Sandbox Code Playgroud)
这是swift中的一个简单的计时器类,使您能够:
SimpleTimer(interval: 3,repeats: true){print("tick")}.start()//Ticks every 3 secs
Run Code Online (Sandbox Code Playgroud)
class SimpleTimer {/*<--was named Timer, but since swift 3, NSTimer is now Timer*/
typealias Tick = ()->Void
var timer:Timer?
var interval:TimeInterval /*in seconds*/
var repeats:Bool
var tick:Tick
init( interval:TimeInterval, repeats:Bool = false, onTick:@escaping Tick){
self.interval = interval
self.repeats = repeats
self.tick = onTick
}
func start(){
timer = Timer.scheduledTimer(timeInterval: interval, target: self, selector: #selector(update), userInfo: nil, repeats: true)//swift 3 upgrade
}
func stop(){
if(timer != nil){timer!.invalidate()}
}
/**
* This method must be in the public or scope
*/
@objc func update() {
tick()
}
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
296217 次 |
最近记录: |