2017-07-02 24 views
5

szukam dodać gest moim zdaniem w sposób następujący:Swift gest 4 add: przesłanianie vs @objc

override func viewDidLoad() { 
    super.viewDidLoad() 

    < blah blah blah > 

    // Add tap gesture 
    let tap = UITapGestureRecognizer(target: self, action: #selector(handleTap)) 
    myView.addGestureRecognizer(tap) 
} 

Jednak w Swift 4 mój kompilator daje mi następujący błąd:

Argument of '#selector' refers to instance method 'handleTap()' that is not exposed to Objective-C 

Sugeruje się dodanie @objc do ujawnienia tej metody instancji do Objective-C.

Inną opcją do zaimplementowania tego (tylko za pomocą kodu) byłoby zastąpienie funkcji touchesBegan() i użycie jej do obsługi kranu.

Próbuję zrobić to w sposób "Swift" bez konieczności wprowadzania Obj-C. Czy istnieje czysty sposób Swift, aby dodać ten gest bez korzystania z @objc? Czy jest to normalny i zamierzony sposób dodania tego gestu dotykowego?

+0

Możliwy duplikat [Jak radzić sobie z wycofaniem zapytania @objc za pomocą #selector() w Swift 4?] (Https://stackoverflow.com/questions/44390378/how-can-i-deal-with-objc -inference-deprecation-with-selector-in-swift-4) – LinusGeffarth

Odpowiedz

17

Tutaj jest normalny i zamierzony sposób.

Podstawowy kod rozpoznawania gestów zapisany jest w Objective-C, więc konieczne jest wywołanie swojego selektora z Objective-C, a to wszystko robi @objc.

Twoja alternatywna technika wciąż używa Objective C-API, ale wchodzi w interakcje z nimi bez selektorów, więc jest po prostu mniej widoczna.

+0

Dobra odpowiedź;) Dodam tylko, że ta zmiana została zaimplementowana przez propozycję [Limiting @objc] (https://github.com/apple/swift -evolution/blob/master/proposals/0160-objc-inference.md) w Swift 4. –