2015-02-01 27 views
5

Ho esteso UIView di conformarsi UIGestureRecognizerDelegate protocolloSwift UIView generico sottoclasse con emissione protocollo

Il codice di seguito viene compilato

let label = UILabel() 
let recognizer = UITapGestureRecognizer(target: label.self, action: Selector("tapGestureHandler:")) 
recognizer.delegate = label.self 
label.addGestureRecognizer(recognizer) 

Ora sto cercando di creare una sottoclasse generico per creare UIView diverso sottoclasse

class MyView<T:UIView> { 
    init() { 
     (T.self as T.Type).init(frame: CGRectZero) 
    } 

    func addGestureToView() { 
     let recognizer = UITapGestureRecognizer(target: T.self, action: Selector("tapGestureHandler:")) 
     // The below two lines produces syntax error  
     recognizer.delegate = T.self // does not conform to protocol 'UIGestureRecognizerDelegate' 
     T.addGestureRecognizer(recognizer) // UITapGestureRecognizer cannot convertible to UIView 
    } 
} 

La cosa strana per me è, T.addGestureRecognizer aspetta UIView piuttosto che UIGestureRecognizer

Aggiornamento:

voglio il tipo di ritorno di MyView essere sottoclasse di UIView,

let view = MyView<UIView>() 

// voglio usare in questo modo

view.tintColor = UIColor.redColor() // I can't 

// Ma, devo usare questo modo

view.subview.tintColor = UIColor.redColor() 

risposta

3

T è il tipo di visualizzazione secondaria. È necessario creare un'istanza di esso per chiamare addGestureRecognizer e impostarlo come delegato di un riconoscitore di gesti.

class MyView<T:UIView where T: UIGestureRecognizerDelegate> { 
    var subview: T 

    init() { 
     subview = T(frame: CGRectZero) 
    } 

    func addGestureToView() { 
     let recognizer = UITapGestureRecognizer(target: subview, action: Selector("tapGestureHandler:")) 

     recognizer.delegate = subview 
     subview.addGestureRecognizer(recognizer) 
    } 
} 

nota che si sta assumendo che la classe passata per creare un'istanza MyView ha un metodo denominato tapGestureHandler:. Probabilmente dovresti aggiungere questo metodo a un protocollo e rendere anche T conforme.

+0

Si prega di verificare i miei commenti aggiornamento, Nel caso in cui, se questo è l'unico modo in cui posso fare quello che mi serviva, io accetto questo come risposta – RK1979

+0

(http://stackoverflow.com/questions/28262520/can- i-use-swift-generic-in-questo-caso) questo è ciò che in realtà voleva risolvere – RK1979

Problemi correlati