Metody zegarowe z selektorem mają mieć jeden parametr: sam czasomierz. Tak więc kod powinien naprawdę wyglądać następująco:
Timer.scheduledTimer(timeInterval: 1.1,
target: self,
selector: #selector(self.adjustmentBestSongBpmHeartRate(_:),
userInfo: nil,
repeats: false)
@objc func adjustmentBestSongBpmHeartRate(_ timer: Timer) {
print("frr")
}
pamiętać, że jeśli aplikacja działa tylko na iOS> = 10, można użyć nowej metody, która przyjmuje blok powołać zamiast docelowej/selektora . Znacznie czystsze i bardziej typu bezpieczne:
class func scheduledTimer(withTimeInterval interval: TimeInterval,
repeats: Bool,
block: @escaping (Timer) -> Void) -> Timer
Ten kod wyglądałby następująco:
timer = Timer.scheduledTimer(withTimeInterval: 1.1,
repeats: false) {
timer in
//Put the code that be called by the timer here.
print("frr")
}
Zauważ, że jeśli blok czasowy/zamknięcie potrzebuje dostępu do zmiennych instancji z klasy trzeba wziąć specjalny opiekę z self
. Oto dobry wzór dla tego rodzaju kodu:
timer = Timer.scheduledTimer(withTimeInterval: 1.1,
repeats: false) {
//"[weak self]" creates a "capture group" for timer
[weak self] timer in
//Add a guard statement to bail out of the timer code
//if the object has been freed.
guard let strongSelf = self else {
return
}
//Put the code that be called by the timer here.
print(strongSelf.someProperty)
strongSelf.someOtherProperty = someValue
}
Edit:
: Dodam, że sposób korzystania z selektora musi użyć Objective-C dynamiczne wysyłki. Możesz zadeklarować metodę z kwalifikatorem @objc
, możesz zadeklarować całą klasę, która definiuje selektor z kwalifikatorem @objc
, lub możesz uczynić klasę, która definiuje selektor podklasę NSObject
lub dowolną klasę dziedziczącą po NSOBject
. (Jest to dość powszechne, aby zdefiniować metodę timer wywołuje wewnątrz UIViewController
, która jest podklasą NSObject
, więc to „po prostu działa”.
Nie sądzę, że musisz wywołać fire() –
Zmieniłem 'repeatates: false' na' repeatats: true', to nadal nie działa. –
Skąd to nazywasz? –