Swift:class 没有实现 methodSignatureForSelector: -- 前面的麻烦 Unrecognized selector
Posted
技术标签:
【中文标题】Swift:class 没有实现 methodSignatureForSelector: -- 前面的麻烦 Unrecognized selector【英文标题】:Swift:class does not implement methodSignatureForSelector: -- trouble ahead Unrecognized selector 【发布时间】:2017-06-16 07:56:05 【问题描述】:class FirstView: UIView
@IBOutlet weak var lbl1: UILabel!
@IBOutlet weak var lbl1: UILabe2!
@IBOutlet weak var btn1: UIButton!
override init(frame: CGRect)
super.init(frame: frame)
setupView()
required init?(coder aDecoder: NSCoder)
super.init(coder: aDecoder)
setupView()
func setupView()
//view setups
现在在下一堂课中,我试图获取按钮的动作事件,但它总是在说 class 'App. UIViewHelper' 没有实现 methodSignatureForSelector: -- 前面的麻烦 无法识别的选择器 +[App. UIViewHelper NotesClicked:]
class UIViewHelper
case 1:
let lowerDetail = FirstView()
lowerDetail.lbl1.text = "Worked"
lowerDetail.lblw.text = "Happy"
lowerDetail.btn1.addTarget(self, action: #selector(NotesClicked), forControlEvents: UIControlEvents.TouchUpInside)
print("Sleep")
break
@objc func NotesClicked(sender :UIButton)
print("Worked")
当 UIViewHelper 扩展 NSObject 崩溃时说 * 由于未捕获的异常 'NSInvalidArgumentException' 导致应用程序终止,原因:'+[App.UIViewHelper NotesClicked:]: unrecognized selector sent to class 0x105771a80 '
我很困惑这里发生了什么。有人可以建议吗?
【问题讨论】:
能否请您发布UIViewHelper
的完整代码?另外,FirstView
有错别字,你能改正吗?
还有其他功能:)。
在您的示例中,FirstView
类上有类似 btnSleepTrackerNotesicon
的属性。请修复您的代码,使其至少在语法上是正确的。另外,为什么它很有趣,你是从静态函数中调用这个case 1
吗?
有一个静态函数可以调用那个switch case
你的类UIViewHelper
必须实现类NSObject
【参考方案1】:
我认为你的问题是你没有从 UIViewHelper 继承 NSObject,试试:
class UIViewHelper : NSObject
【讨论】:
【参考方案2】:您尝试将选择器从静态函数添加到 UIViewHelper
的实例。
当你说的时候
lowerDetail.btn1.addTarget(self, action: #selector(NotesClicked), forControlEvents: UIControlEvents.TouchUpInside)
您正在向self
(UIViewHelper
的一个实例)添加一个目标操作,但是来自一个静态函数。
我想您没有创建UIViewHelper
的实例,就像您在评论中提到的switch case
是从静态函数调用的,因此目标引用了nil
对象。
要修复代码,您需要保留对UIViewHelper
的引用,而不是从静态函数中调用它。
怎么做?这是一个简短的 sn-p,可让您了解 Swift 4。
class ViewController: UIViewController
let uiHelper = UIViewHelper()
override func viewDidLoad()
super.viewDidLoad()
let some = uiHelper.makeView()
self.view.addSubview(some)
class UIViewHelper
func makeView() -> FirstView
let lowerDetail = FirstView(frame: CGRect(origin: .zero, size: CGSize(width: 39, height: 39)))
lowerDetail.lbl1.text = "Worked"
lowerDetail.lbl2.text = "Happy"
lowerDetail.btn1.addTarget(self, action: #selector(UIViewHelper.NotesClicked), for: .touchUpInside)
return lowerDetail
@objc func NotesClicked(sender :UIButton)
print("Worked")
【讨论】:
以上是关于Swift:class 没有实现 methodSignatureForSelector: -- 前面的麻烦 Unrecognized selector的主要内容,如果未能解决你的问题,请参考以下文章
swift class type isa-swizzling