Super Newb in Swift und iOS-Entwicklung hier."Klassenname hat keinen Mitgliedsfunktionsname" beim Hinzufügen von UIButton Ziel
Ich folge this tutorial über die Implementierung eines benutzerdefinierten Steuerelements in einer Einzelansicht iOS App. Es ist ein Swift 2-Tutorial, aber bis jetzt mache ich OK alles auf 3 zu transponieren, während ich gehe (ich benutze XCode 8 Beta).
Ich habe eine benutzerdefinierte Klasse, RatingControl
, verbunden mit einem View
im Storyboard.
In der Konstruktor der Klasse, erstelle ich eine Taste:
let button = UIButton(frame: CGRect(x: 0, y: 0, width: 44, height: 44))
button.backgroundColor = UIColor.red()
Dann versuche ich, eine Aktion der Taste zuweisen. Das Tutorial sagt, ich sollte es tun, wie so:
button.addTarget(self, action: #selector(RatingControl.ratingButtonTapped(_:)),
for: .touchDown)
und dann erstellen, in der gleichen RatingControl
Klasse, wobei das Verfahren:
func ratingButtonTapped(button: UIButton) {
print("Button pressed ")
}
Aber wenn ich kompilieren, es klagt:
Typ "RatingControl" hat kein Mitglied "ratingButtonTapped"
ich habe 100% sicher gemacht, dass die Funktion in der Klasse vorhanden und richtig benannt ist. Full source
Gibt es etwas Offensichtliches, das ich vermisse?
Was ich versuchte:
Added
@objc
auf die Klassendefinition gemäß this answer (aber das scheint seltsam für eine Swift-only Sache, nicht wahr?)Hergestellt
ratingButtonTapped()
ausdrücklichpublic
(aber das sieht nicht so aus, als müsste es notwendig sein)Mit Saiten statt Selektor herumgespielt s,
button.addTarget(self, action: "RatingControl.ratingButtonTapped", for: .touchDown)
und viele mehr, aber das stürzt später einfach ab.
A-ha! XCodes Auto-Hinting-Feature beantwortet die Frage: Ich brauche jetzt 'RatingControl.ratingButtonTapped' ohne Klammern. Das funktioniert gut und kompiliert jetzt. Ich könnte diese Frage löschen - aber wenn jemand eine Antwort geben möchte, die dies genauer erklärt, und * warum * es passiert, könnten wir es vielleicht zu einer nützlichen Quelle für zukünftige Leser machen, die das gleiche Problem haben? –
Ich denke, die Frage ist in Ordnung, solange sie mit 'swift3' gekennzeichnet ist, da dies wahrscheinlich zu einiger Verwirrung führen wird, sobald Swift 3 zum Standard wird. Ein Tipp zu Selektoren: Wenn sich die Methode im selben Bereich wie der Aufrufer befindet, können Sie 'self.methodName' anstelle von' ClassName.methodName' aufrufen, nur ein kosmetisches Detail. – xoudini
@xoudini danke! –