2016-06-02 28 views
9

Bir RegisterGestureRecognizers işlevi ekleyerek Swift'deki bir Protokolü genişletmeye çalışıyorum. İşte tam bir uygulama.Swift'de Seçici ile Protokol Uzantıları

FilterableView, UIImageView öğesinden devralınan sınıflar tarafından kullanılır.

let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(Self.filterTapped(_:))) 

şu mesajı alıyorum:

Argument of '#selector' refers to a method that is not exposed to Objective-C 

ben eksik Bu hatta

import UIKit 

protocol FilterableView : class { 

    var name :String { get } 
    var view :UIImageView { get } 

    func applyFilter(originalImage :UIImage) -> UIImage 
} 

extension FilterableView { 

    func registerGestureRecognizers() { 

     let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(Self.filterTapped(_:))) 

    } 

    func filterTapped(recognizer :UITapGestureRecognizer) { 
      print("filter Tapped") 
    } 

} 

?

@objc anahtar sözcüğünü ekledim ama aynı sorunları. GÜNCELLEME 2

enter image description here

:

Şimdi, FilterableView protokolüne uygun olan benim sınıflarında sorun var. Protokol uzatma yönteminde uygulamayı sağlasa da Xcode, sınıflarımdaki filterTapped işlevini uyguladığım için şikayet ediyor.

+0

Protokolünüze yanlış işlevi ekliyorsunuz. 'Func filterTapped (tanıyıcı: UITapGestureRecognizer)' – JAL

+0

'u eklemelisiniz ve bazı nedenlerden dolayı # # selektör (Self.filterTapped (_ :)) 'i bu' #selector (filterTapped) 'olarak değiştirdiniz. Lütfen doğru şekilde değiştirmeyin. kodun bir parçası. –

+0

'FilterableView.filterTapped' i (_ :) ' –

cevap

0

Düzenlemenizi yeniden yapın: yanlış işlevi protokolünüze eklediniz. func filterTapped(recognizer: UITapGestureRecognizer)func registerGestureRecognizers()'u ekleyin.

@objc protocol FilterableView: class { 

    var name: String { get } 
    var view: UIImageView { get } 

    func applyFilter(originalImage: UIImage) -> UIImage 
    func filterTapped(recognizer: UITapGestureRecognizer) 
} 

extension FilterableView { 

    func registerGestureRecognizers() { 

     let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(Self.filterTapped(_:))) 

    } 

    func filterTapped(recognizer :UITapGestureRecognizer) { 
     print("filter Tapped") 
    } 

} 
+0

Neden protokole herhangi bir şey koymam gerekiyor? Neden sadece protokol uzantısında olamazlar. –

+1

@johndoe Protokol eklentisi, Objective-C'ye dolaylı olarak açık değildir. Bu yüzden, '@ objc' protokolünde bildirmeniz gerekiyor. – JAL

+0

Protokolde filterTapped'i göstersem ve protokol uzantısında filterTapped uygulamasına rağmen. FilterTapped işlevini uygulamazsam, beton sınıfları hala şikayet ediyor. –