Super newb w rozwoju Swift i iOS tutaj."classname nie ma nazwy funkcji member" podczas dodawania celu UIButton
Podążam za this tutorial informacjami o implementacji niestandardowego elementu sterującego w jednym widoku aplikacji na iOS. Jest to samouczek Swift 2, ale do tej pory robię OK, transponując wszystko na 3, kiedy jestem (używam XCode 8 Beta).
Mam niestandardową klasę, RatingControl
, połączoną z View
w scenorysie.
W konstruktorze klasy, w I utworzyć przycisk:
let button = UIButton(frame: CGRect(x: 0, y: 0, width: 44, height: 44))
button.backgroundColor = UIColor.red()
Następnie próbuję przypisać akcję do przycisku. Samouczek mówi, że powinniśmy to zrobić tak:
button.addTarget(self, action: #selector(RatingControl.ratingButtonTapped(_:)),
for: .touchDown)
a następnie utworzyć w tym samym RatingControl
klasie, metoda:
func ratingButtonTapped(button: UIButton) {
print("Button pressed ")
}
Ale kiedy mogę skompilować, narzeka:
typ "RatingControl" nie ma członka "ratingButtonTapped"
Mam w 100% upewnił się, że funkcja istnieje w klasie i jest odpowiednio nazwana. Full source
Czy jest coś oczywistego, czego mi brakuje?
Co próbowałem:
Dodane
@objc
do definicji klasy, jak na this answer (ale wydaje dziwne dla Swift-jedyną rzeczą, nie?)Wykonane
ratingButtonTapped()
wyraźniepublic
(ale to nie wygląda na to, że powinno być konieczne)Fiddled wokół z ciągów zamiast wybieraka s,
button.addTarget(self, action: "RatingControl.ratingButtonTapped", for: .touchDown)
i wiele innych, ale to powoduje awarię później.
A-ha! Funkcja automatycznego podpowiedzi XCode'a odpowiedziała na pytanie: Muszę teraz użyć 'RatingControl.ratingButtonTapped', bez nawiasów. To działa dobrze i kompiluje się teraz. Mógłbym usunąć to pytanie - ale jeśli ktoś chciałby udzielić odpowiedzi wyjaśniającej to bardziej szczegółowo i * dlaczego * tak się dzieje, moglibyśmy uczynić go użytecznym zasobem dla przyszłych czytelników mających ten sam problem? –
Myślę, że pytanie jest w porządku, o ile jest oznaczane jako "swift3", ponieważ prawdopodobnie spowoduje to pewne zamieszanie, gdy tylko Swift 3 stanie się standardem. Jedna wskazówka dotycząca selektorów: jeśli metoda znajduje się w tym samym zakresie co wywołujący, możesz wywołać 'self.methodName' zamiast' ClassName.methodName', ale tylko detal kosmetyczny. – xoudini
@xini dzięki! –