2017-01-25 3 views
-1

У меня есть пользовательский вид, который нужно щелкнуть и сделать какое-то действие. У меня есть два CustomView на одном экране. Я хочу определить, какой из них щелкнуть, чтобы выполнить различные действия.обнаружить, какой uiview коснулся

Можно ли установить некоторые идентификаторы, чтобы определить, на какой именно щелчок?

Вот мой 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 класса, имеет замыкание и вызывает это закрытие при просмотре представления. Это, пожалуй, более «современный» подход, но делегация по-прежнему действительна и как вы это делаете, это вопрос мнения. Лично одно преимущество, которое я вижу для делегирования, - это когда вы просматриваете код, вы можете быстро найти функцию делегата в классе, в то время как закрытие может быть менее очевидным.

+0

спасибо большое за ваш ответ, это действительно помогло мне. Я думал, что «современный» способ - это использование делегирования, можете ли вы просто отправить мне ссылку на ссылку «закрыть удержание и вызвать закрытие»? Я действительно не понял, что это значит. – pmb

0

Лучший способ сделать это - определить поведение прикосновения для вашего CostomView, от родительского класса или контроллера представления, например, с закрытием. Самый быстрый (но довольно уродливый) способ - установить разные теги для этих просмотров и код для разных тегов.

Смежные вопросы