【问题标题】:Swift:class does not implement methodSignatureForSelector: -- trouble ahead Unrecognized selectorSwift:class 没有实现 methodSignatureForSelector: -- 前面的麻烦 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

标签: ios swift


【解决方案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")
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-31
      • 1970-01-01
      • 2011-02-23
      • 2012-02-04
      • 1970-01-01
      • 2014-08-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多