Swift:Class未实现methodSignatureForSelector:-遇到麻烦无法识别的选择器

Sam*_*Sam 3 ios swift

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'

我很困惑这里发生了什么,有人可以建议吗?

Car*_*dal 7

我认为您的问题是您没有从UIViewHelper继承NSObject,请尝试:

class UIViewHelper : NSObject{
Run Code Online (Sandbox Code Playgroud)


dir*_*nee 2

您尝试将静态函数中的选择器添加到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)