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
}
}
Run Code Online (Sandbox Code Playgroud)
现在,在下一堂课中,我尝试获取按钮的action事件,但它总是会提示“ 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")
}
}
Run Code Online (Sandbox Code Playgroud)
当UIViewHelper扩展NSObject时,崩溃*因未捕获的异常'NSInvalidArgumentException'而终止应用程序,原因:'+ [App.UIViewHelper NotesClicked:]:无法识别的选择器发送给类0x105771a80'
我很困惑这里发生了什么,有人可以建议吗?
我认为您的问题是您没有从UIViewHelper继承NSObject,请尝试:
class UIViewHelper : NSObject{
Run Code Online (Sandbox Code Playgroud)
您尝试将静态函数中的选择器添加到UIViewHelper.
当你说
lowerDetail.btn1.addTarget(self, action: #selector(NotesClicked), forControlEvents: UIControlEvents.TouchUpInside)
Run Code Online (Sandbox Code Playgroud)
您正在将目标操作添加到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")
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2675 次 |
| 最近记录: |