2017-09-10 16 views
0

3つのサブビューを持つカスタムUIControlがあります。これらのサブビューのそれぞれが、私はターゲットを追加:カスタムuicontrolとコントローラのタッチイベントを追加するには?

button.addTarget(self, action: #selector(buttonTapped(clickedBtn:)), for: .touchUpInside) 

その機能buttonTappedの中で、それはいくつかの遷移を行うためにいくつかの特別なアニメーションを行います(これは、セグメント化されたコントロールを模倣します)。

ここで、このカスタムUIControlが存在するViewController内では、タッチ時にそれを知る必要があります。カスタムUIControlのタッチイベントと対話する@IBAction関数を作成しました。

問題は、(私が知っている限り)それはできません。サブビューにターゲットタッチイベントを追加すると、親タッチイベントは呼び出されません。親ビューに@IBActionという関数を呼び出すには、すべてのサブビューのsetUserInteractiveEnabled toをtrueに設定する必要があります。私がそれをすると、サブビューのタッチイベント関数は呼び出されません。

私は両方のタッチイベント関数を呼び出す必要があります。これどうやってするの?これを回避する最善の方法は何ですか?

+0

あなたは*全体*カスタムコントロールを持ってもらえ、その後 '.touchUpInside'で' IBAction'は、サブビューをタップされた* *を決定しますか? – dfd

答えて

2

代理人を使用して、というプロトコルをUIControlに追加します。これはViewControllerに実装する必要があります。

この方法で、UIControlでボタンがクリックされたことを検出し、VC内の特定の機能を呼び出すことができます。例については

//YourUIControl.Swift 
protocol YourUIControlDelegate { 
    func didTapFirstButton() 
} 

class YourUiControl : UIView { //I'm assuming you create your UIControl from UIView 

    var delegate : YourUIControlDelegate? 
    //other codes here 
    . 
    . 
    . 
    @IBAction func tapFirstButton(_ sender: AnyObject) { 
    if let d = self.delegate { 
     d.didTapFirstButton() 
    } 
    } 
} 

//YourViewController.Swift 
extension YourViewController : UIControlDelegate { 
    func didTapFirstButton() { 
    //handle first button tap here 
    } 
} 
+0

それはうまくいった!私が追加しなければならなかったのは、 'YourViewController'の' viewDidLoad'の中に 'YourUIControl'デリゲートをselfに設定する必要があります。 –

+0

うん!それはトリックを行います。 :) よくやった –

関連する問題