无法识别的选择器发送到从笔尖实例化的视图控制器中的实例错误

unrecognized selector sent to instance error in view controller instantiated from a nib

我创建了一个名为 FacebookLoginView 的 UIViewController 并带有一个 nib 文件。 nib 的文件所有者设置为 FacebookLoginView。我在上面添加了两个按钮,并在 .swift 文件中添加了 IBActions。

import UIKit
import FacebookLogin

class FacebookLoginView: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }

    // MARK: - Actions
    @IBAction func didTapCloseButton(_ sender: UIButton) {
        dismiss(animated: true, completion: nil)
    }

    @IBAction func didTapFacebookLoginButton(_ sender: UIButton) {
        print(#function)
    }

}

我实例化了这个 FacebookLoginView 并像这样从另一个视图控制器显示它。

let vc = FacebookLoginView.loadFromNib()
present(vc, animated: true, completion: nil)

extension UIViewController {
    class func loadFromNib<T: UIViewController>() -> T {
        return T(nibName: String(describing: self), bundle: nil)
    }
}

当我点击 FacebookLoginView 上的任一按钮时,它崩溃并出现以下错误。

-[UIViewController didTapFacebookLoginButton:]: unrecognized selector sent to instance 0x14d62940 2017-08-07 20:51:00.997802+0530 RandomFlyer[4010:910999] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[UIViewController didTapFacebookLoginButton:]: unrecognized selector sent to instance 0x14d62940'

我删除并重新添加了 IBAction 个连接,但错误仍然存​​在。

使用界面构建器 (IB) 时,请确保您拥有的每个视图都与您的 outletsset events 良好连接存在,像这样:

编辑:虽然此答案可应用于 IB 中常见崩溃的最常见原因,但如果这不能回答您的问题,您可能需要编辑您的问题。

它说:

-[UIViewController didTapFacebookLoginButton:]: unrecognized selector sent to instance

您的 didTapFacebookLoginButton 未在您的 class 中找到,即 FacebookLoginView,您实际上是将 Touch Up Inside 事件指向您的 File Owner。删除它并按照我的屏幕截图中的示例进行操作。

我猜你没有正确使用泛型,其中 T 是 UIViewController 类型,但初始化器需要具体类型。这应该可以代替:

extension UIViewController {
    class func loadFromNib() -> Self {
        return self.init(nibName: String(describing: self), bundle: nil)
    }
}