2017-01-25 12 views
-1

私はクリックして何らかのアクションを行うカスタムビューを持っています。 同じ画面に2つのCustomViewがあります。私は、どのアクションがクリックされたかを検出したい。どのuiviewがタッチされたかを検出する

どのIDが正確にクリックされたかを検出するようにいくつかのIDを設定することはできますか?ビューは、デリゲートに自分自身への参照を提供するように、あなたはあなたのデリゲートの機能を変更する必要があり、委任を使用する場合は

は、ここに私のCustomView

protocol CostomViewDelegate: class { 
    func viewClicked() 
} 

class CostomView: UIView, UIGestureRecognizer { 

    @IBOutlet weak var placeholderlbl: UILabel! 
    @IBOutlet weak var textLbl: UILabel! 
    weak var delegate: CostomViewDelegate? 

    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { 
     self.layer.backgroundColor = UIColor.red.cgColor 
    } 

    override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) { 

    } 

    override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) { 
     self.layer.backgroundColor = UIColor.white.cgColor 
     delegate?.viewClicked() 
    } 
} 

答えて

1

です。

protocol CostomViewDelegate: class { 
    func costomView(clicked: CostomView) 
} 

class CostomView: UIView, UIGestureRecognizer { 

    @IBOutlet weak var placeholderlbl: UILabel! 
    @IBOutlet weak var textLbl: UILabel! 
    weak var delegate: CostomViewDelegate? 

    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { 
     self.layer.backgroundColor = UIColor.red.cgColor 
    } 

    override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) { 

    } 

    override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) { 
     self.layer.backgroundColor = UIColor.white.cgColor 
     delegate?.costomView(clicked: self) 
    } 

} 

は、その後、あなたのデリゲート機能には、適切な行動を取るために渡された参照または他のプロパティの値を比較することができます。

func costomView(clicked: CostomView) { 
    if clicked == self.costomView1 { 
     // Do something 
    } else if clicked == self.costomView2 { 
     // Do something else 
    } 
} 

をまたそのごCostomViewクラスにプロパティを追加することができますビューがタップされたときにクロージャを保持し、そのクロージャを呼び出します。これは、おそらくより現代的なアプローチですが、委任はまだ有効であり、どのようにそれを行うかは意見の問題です。個人的には、私が委任のために見る利点の1つは、コードを見ることでクラス内のデリゲート関数をすばやく見つけることができますが、クロージャーはそれほど明白ではありません。

+0

本当にありがとうございました。私は '現代的な方法は使用委任だと思っただけですが、あなたは「閉鎖して閉鎖を呼び出す」という例のリンクを送ることができますか?私は本当にその意味が分からなかった。 – pmb

0

あなたのCostomViewのタッチ動作を、親クラスまたはビューコントローラ(例えば、クロージャ付き)から定義するのが最も良い方法です。 (かなり醜い) way - これらのビューには異なるタグを設定し、異なるタグに対しては異なる動作をコーディングします。

関連する問題