Ios 如何识别Swift中已按下的子视图?
我构建了一个名为Ios 如何识别Swift中已按下的子视图?,ios,swift,Ios,Swift,我构建了一个名为SetView的UIView类。在其初始值设定项中,我创建了多个子视图,然后在ViewController中,我想确定按下了哪个子视图。在我的viewDidLoad方法中,我迭代了所有的子视图将它们添加到名为mySubViews的UIView类数组中,它是我的getIndex方法,我试图检索总是检索为nil的值。我假设作为发送方传递的是我的主视图,而不是特定的子视图,但我不知道如何传递特定的子视图,因为#选择器不接受参数。如果能就如何确定按下哪个子视图更新给定子视图的功能提出建议
SetView
的UIView
类。在其初始值设定项中,我创建了多个子视图,然后在ViewController
中,我想确定按下了哪个子视图。在我的viewDidLoad
方法中,我迭代了所有的子视图
将它们添加到名为mySubViews
的UIView
类数组中,它是我的getIndex方法,我试图检索总是检索为nil的值。我假设作为发送方传递的是我的主视图,而不是特定的子视图
,但我不知道如何传递特定的子视图
,因为#选择器不接受参数。如果能就如何确定按下哪个子视图
更新给定子视图
的功能提出建议,我将不胜感激
override func viewDidLoad() {
super.viewDidLoad()
for view in setView.subviews {
mySubViews.append(view)
let gestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(getIndex(_:)))
gestureRecognizer.delegate = self
view.addGestureRecognizer(gestureRecognizer)
}
}
@objc func getIndex(_ sender:UIView) {
print(mySubViews.index(of: sender))
}
发送者应该是手势识别器。然后为视图设置一个标记,并为手势识别器设置相同的标记。然后可以使用
viewWithTag
获取视图
或者你的阵列可能是
override func viewDidLoad() {
super.viewDidLoad()
var index = 0
for view in setView.subviews {
mySubViews.append(view)
let gestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(getIndex(_:)))
gestureRecognizer.tag = index
gestureRecognizer.delegate = self
view.addGestureRecognizer(gestureRecognizer)
index += 1
}
}
@objc func getIndex(_ sender: UITapGestureRecognizer) {
print(mySubViews[sender.tag])
}
也许可以试试这样:
for view in setView.subviews {
let gestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(getIndex(_:)))
gestureRecognizer.delegate = self
view.addGestureRecognizer(gestureRecognizer)
mySubViews.addSubview(view)
}
如果您试图将其添加到中,请不要使用append,并在指定手势后添加它。目标方法中的发送方是手势识别器。它仅被解释为
UIView
这一事实将在您的调用中始终返回nil
请尝试以下操作:
@objc func getIndex(_ sender: UIGestureRecognizer) {
print(mySubViews.index(of: sender.view))
}
不过我还是希望你在超级视图上使用一个手势识别器。然后,您可以通过检查手势识别器是否在视图范围内来检查点击视图:
@objc func getIndex(_ sender: UIGestureRecognizer) {
let allViewsAtGestureLocation = mySubViews.filter { $0.bounds.contains(sender.location(in: $0)) }
let firstHitView = mySubViews.first(where: { $0.bounds.contains(sender.location(in: $0)) })
}
我想你需要第二个。您可以从中再次找到索引。您不需要向每个子视图添加手势,只需在主视图中添加手势即可。您可以从点击手势发送器中获取点击的视图。@I请输入点击手势的什么属性来检索按下的点击手势发送器?我已经查看了散列值,实际上,对于单击的不同子视图,它们是不同的。但是,它们会随着应用程序的每次编译而改变,因此我无法使用它们来识别特定的子视图扫描您只需尝试
getIndex(u发送者:UIgestureRecognitizer){print(mySubViews.index(of:sender.view))
只需使用一个点击手势。从发送者.view
中,您可以获得被点击的视图。在尝试后,它仍然为零。我相信您可以在没有标签的情况下也这样做,只需使用发送者.view
@MaticOblak您是对的。我不想发布一些我没有测试过的东西,以确保它能正常工作。谢谢您的澄清。