Swift:类没有实现methodSignatureForSelector: - 前面的麻烦无法识别的选择器

时间:2017-06-16 07:56:05

标签: 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

        }
    }

现在在下一堂课我试图获得按钮的动作事件,但它总是在说 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'

我很困惑这里发生的事情。任何人都可以提出这个问题吗?

2 个答案:

答案 0 :(得分:4)

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

class UIViewHelper : NSObject{

答案 1 :(得分:1)

您尝试将静态函数中的选择器添加到UIViewHelper的实例。

当你说

lowerDetail.btn1.addTarget(self, action:   #selector(NotesClicked), forControlEvents: UIControlEvents.TouchUpInside)

您正在向selfUIViewHelper的实例)添加目标操作,但是,从静态函数添加。

我想你没有创建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")
    }
}