2017-10-27 3 views
2

Ich möchte einen Verschluss hinzufügen, wenn Benutzer eine UILabel tippen:hinzufügen Closure Aktion auf einem UILabel

class ActionLabel: UILabel { 
    typealias DidTapLabel = (ActionLabel) ->() 

    private let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(didTouchUpInside(sender:))) 

    var didTouchUpInside: DidTapLabel? { 
     didSet { 
      if didTouchUpInside != nil { 
       self.addGestureRecognizer(tapGestureRecognizer) 
       self.isUserInteractionEnabled = true 
      } else { 
       self.removeGestureRecognizer(tapGestureRecognizer) 
       self.isUserInteractionEnabled = false 
      } 
     } 
    } 

    // MARK: - Actions 
    @objc func didTouchUpInside(sender: ActionLabel) { 
     if let handler = didTouchUpInside { 
      handler(self) 
     } 
    } 
} 

Nutzung:

label.didTouchUpInside = { [weak self] sender in 
     guard let strongSelf = self else {return} 
     print(strongSelf) 
    } 

aber scheint nicht

Antwort

3

arbeiten können Sie nicht initialisieren der Gestenerkenner mit einem Verweis auf self, da die Initialisierung zu diesem Zeitpunkt noch nicht abgeschlossen ist. Drucken der Gestenerkenner Array zeigt, dass die Informationen die target nicht

addGestureRecognizer(tapGestureRecognizer) 
print("\(gestureRecognizers)") 

Ausgang gesetzt ist (Blick auf das Ende der Zeile)

Optional([<UITapGestureRecognizer: 0x6000001f9600; state = Possible; view = <asdfefe.ActionLabel 0x7fd714a03ea0>; target= <(action=didTouchUpInside:, target=<(null) 0x0>)>>]) 

Also, dieses Problem zu lösen Sie die Gestenerkenner in einem initialisieren init Anruf

private var tapGestureRecognizer:UITapGestureRecognizer! 

override init(frame: CGRect) { 
    super.init(frame: frame) 
    tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(didTouchUpInside)) 
} 

Hoffnung, das hilft :)

0

Th e Grund, warum Ihr Code nicht funktioniert, ist:

private let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(touchAction)) 

tartget: Selbst ist der Punkt, wenn der ActionLabel initialisiert wird, wird es dem lokalen Variable oder Konstante zuerst geladen werden, so dass Sie bekommen ein Nullziel, weil self jetzt nicht initialisiert ist und die Berührungsaktion nicht aufruft, wenn Sie auf Ihre Ansicht tippen.

Die gute Lösung ist:

var didTouchUpInside: DidTapLabel? { 
    didSet { 
     if didTouchUpInside != nil { 
      self.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(touchAction))) 
      self.isUserInteractionEnabled = true 
     } else { 
      if let tapGestureRecognizer = self.gestureRecognizers?[0] as? UITapGestureRecognizer { 
       self.removeGestureRecognizer(tapGestureRecognizer) 
      } 
      self.isUserInteractionEnabled = false 
     } 
    } 
} 
Verwandte Themen