swift NSTimer userinfo
Ich versuche, übergeben Sie einen UIButton mit einem NSTimer die userinfo. Ich habe gelesen, jeden Beitrag auf stackoverflow auf NSTimers. Ich bin immer sehr nah, kann aber nicht Recht bekommen es. Dieser Beitrag geholfen hat,
func timeToRun(ButonToEnable:UIButton) {
var tempButton = ButonToEnable
timer = NSTimer.scheduledTimerWithTimeInterval(4, target: self, selector: Selector("setRotateToFalse"), userInfo: ["theButton" :tempButton], repeats: false)
}
die Funktion der timer läuft
func setRotateToFalse() {
println( timer.userInfo )//just see whats happening
rotate = false
let userInfo = timer.userInfo as Dictionary<String, AnyObject>
var tempbutton:UIButton = (userInfo["theButton"] as UIButton)
tempbutton.enabled = true
timer.invalidate()
}
Du musst angemeldet sein, um einen Kommentar abzugeben.
Merke ich, Sie haben es geschafft, dieses Problem zu beheben, aber ich dachte, ich würde Ihnen ein wenig mehr Informationen über die Verwendung
NSTimer
. Der richtige Weg, um das timer-Objekt und damit die Benutzerinformationen zu verwenden, wie unten. Bei der Initialisierung des timer können Sie erstellen Sie es wie folgt:Swift 2.x
Swift 3.x<
Dann der callback sieht so aus:
Daher brauchen Sie nicht zu halten eine Referenz auf den timer, und vermeiden oft böse Globale Variablen, soweit möglich. Sie kann laufen in ein Problem, in swift, wenn Sie Ihre Klasse nicht Erben aus
NSObject
wo es sagt, es ist keine callback definiert, aber dies kann leicht behoben werden, durch hinzufügen von@objc
am Anfang der definition einer Funktion.userInfo
, müssen Sie einfach nur ein Objekt, das entspricht einerAnyObject?
. Persönlich, ich benutzte es, um pass einString
Ich war gerade dabei zu posten, wie ich gelesen habe über Sie, bevor ich gepostet. Ich bemerkte, dass ich hatte
timer.invalidate()
vor userinfo so dass ist, warum es nicht funktioniert. Ich poste es, wie es kann helfen, jemand anderes.macOS 10.12+ und iOS 10.0+ führt eine block-basierte API von
Timer
das ist ein bequemer Weg,Einem one-shot-timer für ungültig erklärt werden, wird automatisch nach Feuer.
Eine ähnlich bequeme Möglichkeit für einen one-shot-timer ist mit GCD (
DispatchQueue.main.asyncAfter
)