首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >UIGestureRecognizer不向其他类发送操作

UIGestureRecognizer不向其他类发送操作
EN

Stack Overflow用户
提问于 2018-06-10 02:05:16
回答 1查看 973关注 0票数 1

我正在尝试从UIView类的UIGestureRecognizer向其父类的View Controller发送操作。

HomeViewController包含一个包含多个(5) OperationViews的视图。

OperationView扩展了UIView,如下所示:

代码语言:javascript
复制
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调用的函数:

代码语言:javascript
复制
@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中,如下所示:

代码语言:javascript
复制
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!)

我在其中添加了:

代码语言:javascript
复制
var swipeGestureRecognizer: UISwipeGestureRecognizer?
var tapGestureRecognizer: UITapGestureRecognizer?

为OperationView的变量创建类

这是可行的,但还远远谈不上优雅(想象一下,如果我不得不添加另一个view...kinda,这会使我之前的抽象失去意义)

知道是怎么回事吗?或者我错过了什么?

我使用的是Swift 4Xcode 9

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-10 03:12:39

您在方法中创建该手势,并且该手势可能仅在调用函数时位于该作用域中。所以从技术上讲,在你使用它之前它就消失了。因此,在方法之外创建该手势的实例可能会在视图存在的同时存在。如果这有意义的话。

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

这样做怎么样?

代码语言:javascript
复制
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
   }
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50777148

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档