2017-06-12 1 views
1

Kann mir jemand sagen, warum dieser Code die Fehlermeldung gibt "Argument von '#selector' bezieht sich nicht auf '@objc' Methode, Eigenschaft oder Initialisierer "?Argument von '#selector' bezieht sich nicht auf '@objc' Methode, Eigenschaft oder Initialisierer

timer = Timer.scheduledTimer(timeInterval: 0.1, target: self, selector:#selector(updateTimer(until: 3)), userInfo: nil, repeats: true) 

Hier ist die Funktion:

func updateTimer(until endTime: Int) { 
    counter -= 1 
    timeLabel.text = String(counter) 
    if counter == endTime { 
     step += 1 
    } 
} 

Was ich versucht habe:
1. @objc vor der Funktion Hinzufügen.

Antwort

1

Der Selektor einer Ziel-/Aktionsmethode muss entweder ohne Parameter oder mit einem Parameter sein, der das betroffene Objekt übergibt.

Bei Timer den Parameter userInfo verwenden, um Daten zu übergeben.

timer = Timer.scheduledTimer(timeInterval: 0.1, target: self, selector:#selector(updateTimer(_:)), userInfo: 3, repeats: true) 


func updateTimer(_ timer: Timer) { 
    let endTime = timer.userInfo as! Int 
    counter -= 1 
    timeLabel.text = String(counter) 
    if counter == endTime { 
     step += 1 
    } 
} 

Wenn der umschließenden Klasse erbt nicht Form NSObject Sie haben das @objc Attribut auf die Aktionsmethode hinzuzufügen.

+0

Für Timer ist der Parameter erforderlich. * Der Selektor sollte die folgende Signatur haben: timerFireMethod: (einschließlich eines Doppelpunkts, um anzuzeigen, dass die Methode ein Argument benötigt). * Seitennotiz - In Swift 4 ist wahrscheinlich auch das '@ objc' oder' @ obcMembers' der Klasse erforderlich . – Sulthan

+1

@Sulthan Das stimmt nicht. 'updateTimer()' ohne Parameter funktioniert auch. * sollte haben * ist nicht * muss haben * ;-) – vadian

Verwandte Themen