【问题标题】: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

标签: swift cocoapods selector uitapgesturerecognizer swift-framework


【解决方案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)
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-30
    • 1970-01-01
    • 2013-07-28
    • 1970-01-01
    相关资源
    最近更新 更多