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)

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

我想您没有创建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

swift Class和struct的区别

swift class的动态派发

Swift-Class和Struct的区别(结构体和类的区别)

使用 AVR TWI 接口的问题

没有OrderedDictionary的通用实现?