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: - 提前麻烦 无法识别的选择器+ [应用程序。 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: ]:无法识别的选择器发送到类0x105771a80'
我很困惑这里发生的事情。任何人都可以提出这个问题吗?
答案 0 :(得分:4)
我认为您的问题是您没有从UIViewHelper继承NSObject,请尝试:
class UIViewHelper : NSObject{
答案 1 :(得分:1)
您尝试将静态函数中的选择器添加到UIViewHelper
的实例。
当你说
时lowerDetail.btn1.addTarget(self, action: #selector(NotesClicked), forControlEvents: UIControlEvents.TouchUpInside)
您正在向self
(UIViewHelper
的实例)添加目标操作,但是,从静态函数添加。
我想你没有创建UIViewHelper
的实例,就像你在评论中提到的那样从静态函数调用switch case
,因此目标引用了nil
对象
要修复代码,您需要保留对UIViewHelper
的引用,而不是从静态函数调用它。
怎么做?这是一个简短的片段,可以在 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")
}
}