Swift 3:发送到实例 Xcode 8 的无法识别的选择器 [重复]

Posted

技术标签:

【中文标题】Swift 3:发送到实例 Xcode 8 的无法识别的选择器 [重复]【英文标题】:Swift 3: Unrecognized selector sent to instance Xcode 8 [duplicate] 【发布时间】: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:")) 中的冒号,一切正常!

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

【问题讨论】:

【参考方案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() 中

以上是关于Swift 3:发送到实例 Xcode 8 的无法识别的选择器 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

XCode6/Swift:发送到实例的无法识别的选择器

UIImageView |无法识别的选择器发送到实例 | Xcode 6.4 | iOS 8.4

Swift:手势识别器无法识别的选择器发送到实例

斯威夫特:“无法识别的选择器发送到实例”,Xcode 9.4.1

尝试制作一个屏幕截图按钮,当单击按钮时将屏幕截图发送到我的相机胶卷。斯威夫特 3,Xcode 8,IOS

Swift 3 NSCoder 无法识别的选择器发送到实例