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 的无法识别的选择器 [重复]的主要内容,如果未能解决你的问题,请参考以下文章
UIImageView |无法识别的选择器发送到实例 | Xcode 6.4 | iOS 8.4
斯威夫特:“无法识别的选择器发送到实例”,Xcode 9.4.1