gpt4 book ai didi

ios - UIGestureRecognizer 不向其他类发送操作

转载 作者:行者123 更新时间:2023-11-28 11:57:05 24 4
gpt4 key购买 nike

我正在尝试从 UIView 类上的 UIGestureRecognizer 向其父 View Controller 发送一个 Action 。

HomeViewController 包含一个包含多个 (5) OperationView 的 View 。

OperationView 扩展了 UIView 并且看起来像这样:

class OperationView: UIView {
override func awakeFromNib() {
super.awakeFromNib()

// OperationView is on a view that has HomeViewController as it's controller in StoryBoard
let swipeGestureRecognizer = UISwipeGestureRecognizer(target: HomeViewController.self(), action: #selector(HomeViewController.operatorWasSwiped(_:)))
swipeGestureRecognizer.direction = .left

let tapGestureRecognizer = UITapGestureRecognizer(target: HomeViewController.self(), action: #selector(HomeViewController.operatorWasSwiped(_:)))

self.addGestureRecognizer(swipeGestureRecognizer)
self.addGestureRecognizer(tapGestureRecognizer)
}

在 HomeViewController 中,我有一个应该由 UIGestureRecognizers 调用的函数:

@objc func operatorWasSwiped(_ sender : UIGestureRecognizer) {
if (sender.isKind(of: UITapGestureRecognizer.self)) { print("Tapped") }
else { print("Swiped") }

self.performSegue(withIdentifier: "segue1", sender: nil)
}

但是,我没有得到任何东西。甚至没有错误。

我已经尝试使用 HomeViewController 上的 IBOutlet 将 UIGestureRecognizer 添加到每个 OperationView:

view1.swipeGestureRecognizer?.addTarget(self, action: #selector(operatorWasSwiped(_ :)))
view2.swipeGestureRecognizer?.addTarget(self, action: #selector(operatorWasSwiped(_ :)))
view3.swipeGestureRecognizer?.addTarget(self, action: #selector(operatorWasSwiped(_ :)))
view4.swipeGestureRecognizer?.addTarget(self, action: #selector(operatorWasSwiped(_ :)))
view5.swipeGestureRecognizer?.addTarget(self, action: #selector(operatorWasSwiped(_ :)))

view1.tapGestureRecognizer?.addTarget(self, action: #selector(operatorWasSwiped(_ :)))
view2.tapGestureRecognizer?.addTarget(self, action: #selector(operatorWasSwiped(_ :)))
view3.tapGestureRecognizer?.addTarget(self, action: #selector(operatorWasSwiped(_ :)))
view4.tapGestureRecognizer?.addTarget(self, action: #selector(operatorWasSwiped(_ :)))
view5.tapGestureRecognizer?.addTarget(self, action: #selector(operatorWasSwiped(_ :)))

view1.addGestureRecognizer(view1.swipeGestureRecognizer!)
view2.addGestureRecognizer(view2.swipeGestureRecognizer!)
view3.addGestureRecognizer(view3.swipeGestureRecognizer!)
view4.addGestureRecognizer(view4.swipeGestureRecognizer!)
view.addGestureRecognizer(view5.swipeGestureRecognizer!)

view1.addGestureRecognizer(view1.tapGestureRecognizer!)
view2.addGestureRecognizer(view2.tapGestureRecognizer!)
view3.addGestureRecognizer(view3.tapGestureRecognizer!)
view4.addGestureRecognizer(view4.tapGestureRecognizer!)
view5.addGestureRecognizer(view5.tapGestureRecognizer!)

我添加的地方:

var swipeGestureRecognizer: UISwipeGestureRecognizer?
var tapGestureRecognizer: UITapGestureRecognizer?

为OperationView类变量

这行得通,但远谈不上优雅(想象一下,如果我不得不添加另一个 View ……有点违背了我之前的抽象观点)

知道发生了什么事吗?或者我缺少什么?

我正在使用 Swift 4Xcode 9

最佳答案

您正在方法内部创建该手势,并且该手势可能仅在调用该函数时存在于该范围内。所以技术上在你使用它之前就消失了。因此,在方法之外创建该手势的实例可能会在 View 存在时存在。如果这是有道理的话。

更新:正如评论所指出的,我们确实需要父 viewController 的当前引用。

这样怎么样..

class OperationView: UIView {

let swipeGestureRecognizer = UISwipeGestureRecognizer()
let tapGestureRecognizer = UITapGestureRecognizer()

override func awakeFromNib() {
super.awakeFromNib()

if let parentViewController = parentViewController {
swipeGestureRecognizer.addTarget(parentViewController, action: #selector(HomeViewController.operatorWasSwiped(_:)))
swipeGestureRecognizer.direction = .left

tapGestureRecognizer.addTarget(parentViewController, action: #selector(HomeViewController.operatorWasSwiped(_:)))

self.addGestureRecognizer(swipeGestureRecognizer)
self.addGestureRecognizer(tapGestureRecognizer)
}

}
}

extension UIView {

var parentViewController: UIViewController? {
var parentResponder: UIResponder? = self

while parentResponder != nil {
parentResponder = parentResponder!.next

if let viewController = parentResponder as? UIViewController {
return viewController
}
}
return nil
}
}

关于ios - UIGestureRecognizer 不向其他类发送操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50777148/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com