我创建了一个名为FacebookLoginView的UIViewController
,带有一个nib文件。 nib的文件所有者设置为FacebookLoginView。我在其上添加了两个按钮,并在.swift文件中添加了IBAction
。
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
个连接,但错误仍在发生。
答案 0 :(得分:1)
使用界面构建器(IB)时,请确保您拥有的每个视图都与商店连接良好,并且设置事件已存在,如下所示:
编辑:虽然这个答案可以应用于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)
}
}