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您是对的。我不想发布一些我没有测试过的东西,以确保它能正常工作。谢谢您的澄清。