在框架内点击手势不起作用

Posted

技术标签:

【中文标题】在框架内点击手势不起作用【英文标题】:UITapGesture inside Framework not working 【发布时间】:2018-03-26 22:05:29 【问题描述】:

我正在尝试创建我的第一个 Cocoapod 框架,并且需要将一个简单的 UITapGestureRecognizer 附加到一个视图,但我无法从我的框架中调用点击手势 action。我有:

class ViewController: UIViewController 

    override func viewDidLoad() 
         super.viewDidLoad()

        let foo = Foo()
        foo.attachTo(view: view)
    

我使用pod lib create Foo创建了一个框架,里面是

public class Foo 
    public init() 

    public func attachTo(view: UIView) 
        let endpointGesture = UITapGestureRecognizer(target: self, action: #selector(selected(_:)))
        view.backgroundColor = UIColor.blue
        view.isUserInteractionEnabled = true
        view.addGestureRecognizer(endpointGesture)
    

    @objc private func selected(_ sender: UITapGestureRecognizer) 
        print("Gesture Recognized")
    

我可以看出视图已正确传递到框架中,因为构建应用程序会给我一个蓝屏。

将手势识别器和selected 函数移到ViewController 中也可以正常工作。点击视图会将Gesture Recognized 打印到控制台,所以我不理解框架发生了什么。

我已经尝试将-ObjC 链接器标志添加到框架中,但这似乎没有做任何事情。我错过了什么吗?

【问题讨论】:

您发布的代码看起来不错,而且您似乎也知道这一点。通常,框架中的手势旨在触发比print 更多的东西 - 在我的用例中,是给代表的消息。两个想法:(1)如果在print语句上设置断点,会命中吗? (2) 如果是这样,您是否可以 (a) 为您的视图控制器创建一个协议/委托设置,或者 (b) 将事物重构(用于测试)到 UIButton 中以查看发生了什么?看起来您的print 确实没有受到打击。 缺少相关标签... @dfd 设置断点似乎没有做任何事情,这让我相信选择器永远不会被调用。我无论如何都尝试创建一个协议/委托,但它没有像预期的那样调用selected 【参考方案1】:

问题是您的foo 变量没有保留。 如果您将foo 变量作为实例变量,它应该可以工作。

class ViewController: UIViewController 

    let foo = Foo() // this is now retained by the view controller

    override func viewDidLoad() 
        super.viewDidLoad()

        foo.attachTo(view: view)
    

【讨论】:

以上是关于在框架内点击手势不起作用的主要内容,如果未能解决你的问题,请参考以下文章

在 ListView 中点击手势手势识别器不起作用

点击手势事件在 UIView 上不起作用

点击手势不起作用

Xamarin IOS UILabel在UIScrollView中点击手势不起作用

ios uiimageview点击手势在动画期间不起作用

点击手势对我不起作用