【问题标题】:Protocol Extensions with Selectors in SwiftSwift 中带有选择器的协议扩展
【发布时间】:2016-06-02 21:12:47
【问题描述】:

我正在尝试通过添加 registerGestureRecognizers 函数来扩展 Swift 中的协议。这是完整的实现。

FilterableView 由继承自 UIImageView 的类使用。

import UIKit

protocol FilterableView : class  {

    var name :String { get }
    var view :UIImageView { get } 

    func applyFilter(originalImage :UIImage) -> UIImage
}

extension FilterableView {

    func registerGestureRecognizers() {

        let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(Self.filterTapped(_:)))

    }

    func filterTapped(recognizer :UITapGestureRecognizer) {
            print("filter Tapped")
    }

}

在这一行:

 let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(Self.filterTapped(_:)))

我收到以下消息:

Argument of '#selector' refers to a method that is not exposed to Objective-C

我错过了什么?

我添加了@objc 关键字,但同样的问题。

更新 2:

现在,我的类中存在符合 FilterableView 协议的问题。 Xcode 抱怨我必须在我的类中实现 filterTapped 函数,即使我已经在协议扩展方法中提供了实现。

【问题讨论】:

  • 您在协议中添加了错误的功能。你应该添加func filterTapped(recognizer :UITapGestureRecognizer)
  • 是的,由于某种原因,您将 #selector(Self.filterTapped(_:)) 更改为 #selector(filterTapped) 请不要更改代码的正确部分。
  • 试试FilterableView.filterTapped(_:)
  • 你解决过这个问题吗?

标签: ios swift


【解决方案1】:

重新编辑:您在协议中添加了错误的功能。添加func filterTapped(recognizer: UITapGestureRecognizer) 而不是func registerGestureRecognizers()

@objc protocol FilterableView: class  {

    var name: String { get }
    var view: UIImageView { get }

    func applyFilter(originalImage: UIImage) -> UIImage
    func filterTapped(recognizer: UITapGestureRecognizer)
}

extension FilterableView {

    func registerGestureRecognizers() {

        let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(Self.filterTapped(_:)))

    }

    func filterTapped(recognizer :UITapGestureRecognizer) {
        print("filter Tapped")
    }

}

【讨论】:

  • 为什么我什至需要在协议中添加任何内容?为什么它们不能只在协议扩展中。
  • @johndoe 协议扩展并未隐式暴露给 Objective-C。这就是为什么你需要在@objc 协议中声明它。
  • 即使我在协议中公开了 filterTapped 并且即使我在协议扩展中实现了 filterTapped。如果我不实现 filterTapped 函数,具体类仍然会抱怨。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-10
  • 2017-08-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-30
相关资源
最近更新 更多