【问题标题】:Swift 3: Unrecognized selector sent to instance Xcode 8 [duplicate]Swift 3:发送到实例 Xcode 8 的无法识别的选择器 [重复]
【发布时间】:2016-07-13 06:33:16
【问题描述】:

我以编程方式创建了一个UIView 并将UIPanGestureRecognizer 添加到其中:

class ViewController: UIViewController{
    var preludeView: UIView!

    override func viewDidLoad() {
        super.viewDidLoad()

        initViews()
        createConstrants()

        let panGestureRecognizer = UIPanGestureRecognizer(target: self, action: Selector(("handleTap:")))
        preludeView.addGestureRecognizer(panGestureRecognizer)
    }

    func handleTap(recognizer: UIPanGestureRecognizer) {
        print("WORKING!!!!")
    }

    func initViews() {
        ...
    }

    func createConstrants() {
        ...
    }
}

但是当我触摸视图时,Xcode 会抛出错误:

2016-07-13 09:24:29.918 Draft_Hypa_02[661:83024] -[Draft_Hypa_02.ViewController handleTap:]:无法识别的选择器发送到实例 0x17d94a10 2016-07-13 09:24:29.921 Draft_Hypa_02[661:83024] * 由于未捕获的异常而终止应用程序 'NSInvalidArgumentException',原因:'-[Draft_Hypa_02.ViewController handleTap:]: 无法识别的选择器发送到实例 0x17d94a10' * 第一次抛出调用栈:(0x249cf91b 0x2416ae17 0x249d52b5 0x249d2ee1 0x248fe238 0x294ae9eb 0x290e984f 0x28f7aff1 0x294afd4f 0x28f3ba57 0x28f38017 0x28f78ec9 0x28f7867b 0x28f49125 0x28f476d3 0x24991dff 0x249919ed 0x2498fd5b 0x248df229 0x248df015 0x25ecfac9 0x28fb1189 0x93144 0x24587873) libc++abi.dylib: 终止于 NSException 类型的未捕获异常

但是,如果我删除 handleTap 函数中的参数并删除 Selector(("handleTap:")) 中的冒号,一切正常!

已经花了一天时间尝试解决此问题,非常感谢您的帮助!

【问题讨论】:

    标签: ios swift swift3 uigesturerecognizer


    【解决方案1】:

    如果您使用的是swift 3,您的selector 应该是这样的

    #selector(self.handleTap(recognizer:))
    

    【讨论】:

    • Xcode 抛出“'ViewController' 类型的值没有成员 'handleTap'”
    • @Forze 您还需要在方法第一个参数之前添加下划线。 func handleTap(_ recognizer: UIPanGestureRecognizer) {
    • @Nirav 谢谢,它有效!你知道在 Swift 3 中我们必须为动作函数设置外部名称吗?
    • 是的,在swift 3中调用第一个参数你必须写参数名,你可以查看this了解更多信息
    • @LeoDabus,你的评论对我帮助很大!
    【解决方案2】:

    您应该以不同的方式编写此语句。 使用以下行

    让 panGestureRecognizer = UIPanGestureRecognizer(target: self, 动作:#selector(ViewController.handleTap(_:)))

    而不是

    让 panGestureRecognizer = UIPanGestureRecognizer(target: self, 动作:选择器((“handleTap:”)))

    新方法

    让 panGestureRecognizer = UIPanGestureRecognizer(target: self, 操作:#selector(YourViewController.handleTap(_:)))

    【讨论】:

    • Xcode 8 抛出“'ViewController' 类型的值没有成员 'handleTap'”
    • 使用 self 而不是 ViewController 或 viewController 的名称
    • @Forze:handleTap 是方法的名称,您正在调用 func handleTap(sender: UIPanGestureRecognizer){}
    • @Mahendre 我使用了 self ,但仍然出现同样的错误
    • @Markinson 你能发布你的函数及其调用语法
    【解决方案3】:
    class ViewController: UIViewController {
    
        let customView = UIView()
    
        override func viewDidLoad() {
            super.viewDidLoad()
    
            let panGestureRecognizer = UIPanGestureRecognizer(target: self, action: #selector(handleTap(_:)))
            customView.addGestureRecognizer(panGestureRecognizer)
        }
    
        func handleTap(panGesture: UIPanGestureRecognizer) {
    
        }
    }
    

    不要忘记将自定义 UIView 添加到 VC。

    【讨论】:

    • 我在 initViews() 中添加 UIView 并将这个函数放在 viewDidLoad() 中
    猜你喜欢
    • 1970-01-01
    • 2018-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多