试图向UIView
数组添加轻击手势-失败。在此阶段似乎无法识别出点击。
在下面的代码(摘录)中:
主视图上显示一系列PlayingCardViews
(每个UIView
)。
集合为一个数组:cardView
。
需要能够独立点击每个PlayingCardView
(然后才能识别出被点击的那个)。
@IBOutlet private var cardView: [PlayingCardView]!
override func viewDidLoad() {
super.viewDidLoad()
let tap = UITapGestureRecognizer(target: self, action: #selector(tapCard(sender: )))
for index in cardView.indices {
cardView[index].isUserInteractionEnabled = true
cardView[index].addGestureRecognizer(tap)
cardView[index].tag = index
}
}
@objc func tapCard (sender: UITapGestureRecognizer) {
if sender.state == .ended {
let cardNumber = sender.view.tag
print("View tapped !")
}
}
答案 0 :(得分:1)
您需要
@objc func tapCard (sender: UITapGestureRecognizer) {
let clickedView = cardView[sender.view!.tag]
print("View tapped !" , clickedView )
}
这里不需要检查状态,因为这种手势类型的方法仅被调用一次,每个视图都应有一个单独的点击,因此可以在for-循环内创建它
for index in cardView.indices {
let tap = UITapGestureRecognizer(target: self, action: #selector(tapCard(sender: )))
答案 1 :(得分:0)
let tap = UITapGestureRecognizer(target: self, action: #selector(didTapCard(sender: )))
for (index, view) in cardView.enumerated() {
view.isUserInteractionEnabled = true
view.addGestureRecognizer(tap)
view.tag = index
}
然后在您的didTapCard
函数中,您需要检查标签。
答案 2 :(得分:0)
您可以尝试将视图控制器作为参数传递给视图,以便它们可以从视图中调用父视图控制器上的函数。要减少内存,您可以使用协议。 e.x
protocol testViewControllerDelegate: class {
func viewTapped(view: UIView)
}
class testClass: testViewControllerDelegate {
@IBOutlet private var cardView: [PlayingCardView]!
override func viewDidLoad() {
super.viewDidLoad()
for cardView in self.cardView {
cardView.fatherVC = self
}
}
func viewTapped(view: UIView) {
// the view that tapped is passed ass parameter
}
}
class PlayingCardView: UIView {
var fatherVC: testViewControllerDelegate?
override func awakeFromNib() {
super.awakeFromNib()
let gr = UITapGestureRecognizer(target: self, action: #selector(self.viewDidTap))
self.addGestureRecognizer(gr)
}
@objc func viewDidTap() {
fatherVC?.viewTapped(view: self)
}
}
答案 3 :(得分:0)
我不会推荐所选答案。因为在循环中,创建tapGesture数组对我没有意义。最好在PlaycardView中添加手势。
相反,应使用UICollectionView设计此类布局。如果需要自定义布局,并且想使用scrollView甚至UIView,那么更好的方法是创建单个Gesture Recognizer并将其添加到超级视图。
使用点击手势,您可以获取点击位置,然后可以使用该位置获取selectedView。
请参考以下示例:
new Vue({
el: '#app',
data() {
return {
item: null,
items: [
{
text: "a"
},
{
text: "b"
},
{
text: "c"
},
]
}
}
})