2017-10-27 11 views
2

上の閉鎖アクションを追加します。は、私は、ユーザーがUILabelをタップしたときにクロージャを追加したい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) 
     } 
    } 
} 

用法:

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

が、あなたが初期化できません

答えて

3

を動作していないようにその時点で初期化が完了していないため、ジェスチャ認識機能は自己参照を持ちます。 target

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

出力を設定されていないという情報がジェスチャ認識配列を明らかに印刷しますが、ジェスチャ認識を初期化し、これを解決するために、そう

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

(行の終わりを見てください)助け:)

0

のThを初期化コール

private var tapGestureRecognizer:UITapGestureRecognizer! 

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

・ホープあなたのコードが動作しない理由は電子の理由がある:

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

tartget:自己はActionLabelが初期化されるとき、それはあなたの地元の変数または定数最初にロードされます、ポイントですので、あなたが得ますselfは現在は初期化されておらず、ビューをタップしたときにtouchアクションを呼び出さないため、nullターゲットです。

良い解決策は以下のとおりです。

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 
     } 
    } 
} 
関連する問題