无法识别的选择器发送到视图控制器中的实例错误,该控制器是从nib

时间:2017-08-07 14:58:25

标签: ios swift uiviewcontroller xib nib

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

enter image description here

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:]:无法识别的选择器发送到实例0x14d62940 2017-08-07 20:51:00.997802 + 0530   RandomFlyer [4010:910999] ***由于未捕获的异常而终止应用程序   &#39; NSInvalidArgumentException&#39;,原因:&#39; - [UIViewController   didTapFacebookLoginButton:]:发送到实例的无法识别的选择器   0x14d62940&#39;

我删除并读取了IBAction个连接,但错误仍在发生。

2 个答案:

答案 0 :(得分:1)

使用界面构建器(IB)时,请确保您拥有的每个视图都与商店连接良好,并且设置事件已存在,如下所示:

enter image description here

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

它说:

  

- [UIViewController didTapFacebookLoginButton:]:无法识别的选择器发送到实例

在您的班级FacebookLoginView中找不到Touch Up Inside,您实际上是在将File Owner事件指向{{1}}。删除它并按照屏幕截图中的示例进行操作。

答案 1 :(得分:1)

我猜你没有正确使用泛型,其中T是UIViewController类型,但是iniatizer需要具体类型。这应该工作:

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