【问题标题】:How to identify which subView has been pressed in Swift?如何识别在 Swift 中按下了哪个 subView?
【发布时间】:2018-06-14 21:22:45
【问题描述】:

我建立了一个名为SetViewUIView 类。在其初始化程序中,我创建了多个subviews,然后在ViewController 中创建了多个subView,我想确定哪个subView 被按下。在我的viewDidLoad 方法中,我遍历所有subviews 将它们添加到UIView 的类数组中,称为mySubViews,它是我的getIndex 方法,我试图检索始终检索为nil 的值。我想我的主要观点是作为发件人而不是特定的subviews 传递,但我不知道如何传递特定的subviews,因为#selector 不接受参数。对于如何确定按下哪个subview 来更新给定subview 的功能的任何建议,我将不胜感激。

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))
}

【问题讨论】:

  • 您不需要为每个子视图添加手势,只在主视图中添加手势。并且从点击手势发送器中,您可以获取点击了哪个视图。
  • @iPeter 我应该使用点击手势的什么属性来检索按下了哪个点击手势发送者?我查看了哈希值,实际上它们对于单击的不同子视图是不同的。但是,它们会随着应用程序的每次编译而变化,因此我无法使用它们来识别特定的子视图
  • 你可以试试getIndex(_ sender:UIGestureRecognizer) { print(mySubViews.index(of: sender.view))
  • 仅使用 一个 点按手势。并且从sender.view,你可以得到被点击的视图。

标签: ios swift


【解决方案1】:

发送者应该是手势识别器。然后给你的视图一个标签,并为你的手势识别器设置相同的标签。然后您可以通过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])
}

【讨论】:

  • 我相信你可以不用标签也能做到这一点,只需使用sender.view
  • @MaticOblak 你是对的。我不想发布我没有测试过的东西以确保它会起作用。感谢您的澄清。
【解决方案2】:

目标方法中的发送者是手势识别器。它仅被解释为 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)) })
}

我假设您需要第二个。从中您可以再次找到索引。

【讨论】:

    【解决方案3】:

    不妨试试这样的:

    for view in setView.subviews {
        let gestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(getIndex(_:)))
        gestureRecognizer.delegate = self
        view.addGestureRecognizer(gestureRecognizer)
        mySubViews.addSubview(view)
    }
    

    如果您尝试添加它,请不要使用 append,并在分配手势后添加它。

    【讨论】:

    • 尝试后仍然为零。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-24
    • 2012-05-23
    相关资源
    最近更新 更多