"Could not load NIB" 当继承 FUIAuthPickerViewController 时
"Could not load NIB" when subclassing FUIAuthPickerViewController
我能在网上找到的唯一相关问题是关于 GitHub 的问题报告:
https://github.com/firebase/FirebaseUI-iOS/issues/128
然而,似乎没有任何解决办法。
使用 FirebaseUI,我想子类化 FUIAuthPickerViewController
这样我就可以对其进行一些自定义。当我子类化并调用 FUIAuth.defaultAuthUI!.authViewController
时,我得到以下运行时异常:
'NSInternalInconsistencyException', reason: 'Could not load NIB in bundle
我是 Swift 的新手,所以很可能我错误地继承了 FUIAuthPickerViewController
,但我在网上阅读的所有内容都表明情况并非如此。
这是我的子类:
import UIKit
import FirebaseAuthUI
class AuthViewController: FUIAuthPickerViewController {
override func viewDidLoad() {
super.viewDidLoad()
}
}
这是我的代表:
public class AuthManager: NSObject, FUIAuthDelegate {
// TODO: Implement TOS URL
// TODO: Implement custom strings for multiple languages
static let instance = AuthManager()
private override init() {
super.init()
self.firebaseUI().delegate = self;
self.firebaseUI().providers = [FUIGoogleAuth(), FUIFacebookAuth()]
}
public func firebaseUI() -> FUIAuth {
return FUIAuth.defaultAuthUI()!
}
public func firebase() -> FIRAuth {
return FIRAuth.auth()!
}
public func addStateChangeListener(listener: @escaping FIRAuthStateDidChangeListenerBlock) {
self.firebase().addStateDidChangeListener(listener)
}
public func showLoginFrom(viewController: UIViewController) {
viewController.present(self.firebaseUI().authViewController(),
animated: true,
completion: nil)
}
// MARK: FUIAuthDelegate
public func authUI(_ authUI: FUIAuth, didSignInWith user: FIRUser?, error: Error?) {
}
public func authPickerViewController(forAuthUI authUI: FUIAuth) -> FUIAuthPickerViewController {
return AuthViewController(authUI: authUI)
}
}
如果我删除默认 FUIAuthPickerViewController
一切正常。如果未定义,我只是假设子类会从其父类继承其 NIB。
感谢任何帮助。
此致,
科恩
FUIAuthPickerViewController
是 UIViewController
.
The init
documentation 对于 class 说:
If you specify nil for the nibName parameter and you do not override the loadView() method, the view controller searches for a nib file as described in the nibName property.
Specifically, it looks for a nib file with an appropriate name
(without the .nib extension) and loads that nib file whenever its view
is requested. Specifically, it looks (in order) for a nib file with
one of the following names:
If the view controller class name ends with the word ‘Controller’, as in MyViewController, it looks for a nib file whose name matches the
class name without the word ‘Controller’, as in MyView.nib.
It looks for a nib file whose name matches the name of the view controller class. For example, if the class name is MyViewController,
it looks for a MyViewController.nib file.
这里没有任何内容表明它会检查所有 superclasses 的名称以查找 nib。我假设它正在检查 "AuthView.nib" 和 "AuthViewController.nib",然后放弃。
事实证明这是 FirebaseUI 中的一个错误,它从旧版本中重新出现。
可以跟踪问题here。
临时解决方案是在 FUIAuthPickerController
子类中硬编码正确的 NIB 名称:
Swift:
import UIKit
import FirebaseAuthUI
class AuthViewController: FUIAuthPickerViewController {
override init(nibName: String?, bundle: Bundle?, authUI: FUIAuth) {
super.init(nibName: "FUIAuthPickerViewController", bundle: bundle, authUI: authUI)
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
override func viewDidLoad() {
super.viewDidLoad()
}
}
Objective-C:
@implementation CustomAuthPickerViewController
...
- (instancetype)initWithNibName:(NSString *)nibNameOrNil
bundle:(NSBundle *)nibBundleOrNil
authUI:(FUIAuth *)authUI {
self = [super initWithNibName:@"FUIAuthPickerViewController"
bundle:nibBundleOrNil
authUI:authUI];
if (self) {
self.title = @"Your Title";
}
return self;
}
...
@end
这似乎也是由 FirebaseUI 上的错误引起的,我遇到了同样的问题并实施了几个解决方案,但只有在我将 pod 从 Firebase 4.1.0 更新到 Firebase 4.1.1 后它才有效。
此 git repo 还声称此错误已在此更新中修复。
您可以通过以下方式查看当前使用的版本:
'pod search FirebaseUI' 在项目路径位置的终端中,如果它不是最新版本,只需执行 'pod update',这有望解决问题。
我能在网上找到的唯一相关问题是关于 GitHub 的问题报告: https://github.com/firebase/FirebaseUI-iOS/issues/128
然而,似乎没有任何解决办法。
使用 FirebaseUI,我想子类化 FUIAuthPickerViewController
这样我就可以对其进行一些自定义。当我子类化并调用 FUIAuth.defaultAuthUI!.authViewController
时,我得到以下运行时异常:
'NSInternalInconsistencyException', reason: 'Could not load NIB in bundle
我是 Swift 的新手,所以很可能我错误地继承了 FUIAuthPickerViewController
,但我在网上阅读的所有内容都表明情况并非如此。
这是我的子类:
import UIKit
import FirebaseAuthUI
class AuthViewController: FUIAuthPickerViewController {
override func viewDidLoad() {
super.viewDidLoad()
}
}
这是我的代表:
public class AuthManager: NSObject, FUIAuthDelegate {
// TODO: Implement TOS URL
// TODO: Implement custom strings for multiple languages
static let instance = AuthManager()
private override init() {
super.init()
self.firebaseUI().delegate = self;
self.firebaseUI().providers = [FUIGoogleAuth(), FUIFacebookAuth()]
}
public func firebaseUI() -> FUIAuth {
return FUIAuth.defaultAuthUI()!
}
public func firebase() -> FIRAuth {
return FIRAuth.auth()!
}
public func addStateChangeListener(listener: @escaping FIRAuthStateDidChangeListenerBlock) {
self.firebase().addStateDidChangeListener(listener)
}
public func showLoginFrom(viewController: UIViewController) {
viewController.present(self.firebaseUI().authViewController(),
animated: true,
completion: nil)
}
// MARK: FUIAuthDelegate
public func authUI(_ authUI: FUIAuth, didSignInWith user: FIRUser?, error: Error?) {
}
public func authPickerViewController(forAuthUI authUI: FUIAuth) -> FUIAuthPickerViewController {
return AuthViewController(authUI: authUI)
}
}
如果我删除默认 FUIAuthPickerViewController
一切正常。如果未定义,我只是假设子类会从其父类继承其 NIB。
感谢任何帮助。
此致, 科恩
FUIAuthPickerViewController
是 UIViewController
.
The init
documentation 对于 class 说:
If you specify nil for the nibName parameter and you do not override the loadView() method, the view controller searches for a nib file as described in the nibName property.
Specifically, it looks for a nib file with an appropriate name (without the .nib extension) and loads that nib file whenever its view is requested. Specifically, it looks (in order) for a nib file with one of the following names:
If the view controller class name ends with the word ‘Controller’, as in MyViewController, it looks for a nib file whose name matches the class name without the word ‘Controller’, as in MyView.nib.
It looks for a nib file whose name matches the name of the view controller class. For example, if the class name is MyViewController, it looks for a MyViewController.nib file.
这里没有任何内容表明它会检查所有 superclasses 的名称以查找 nib。我假设它正在检查 "AuthView.nib" 和 "AuthViewController.nib",然后放弃。
事实证明这是 FirebaseUI 中的一个错误,它从旧版本中重新出现。
可以跟踪问题here。
临时解决方案是在 FUIAuthPickerController
子类中硬编码正确的 NIB 名称:
Swift:
import UIKit
import FirebaseAuthUI
class AuthViewController: FUIAuthPickerViewController {
override init(nibName: String?, bundle: Bundle?, authUI: FUIAuth) {
super.init(nibName: "FUIAuthPickerViewController", bundle: bundle, authUI: authUI)
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
override func viewDidLoad() {
super.viewDidLoad()
}
}
Objective-C:
@implementation CustomAuthPickerViewController
...
- (instancetype)initWithNibName:(NSString *)nibNameOrNil
bundle:(NSBundle *)nibBundleOrNil
authUI:(FUIAuth *)authUI {
self = [super initWithNibName:@"FUIAuthPickerViewController"
bundle:nibBundleOrNil
authUI:authUI];
if (self) {
self.title = @"Your Title";
}
return self;
}
...
@end
这似乎也是由 FirebaseUI 上的错误引起的,我遇到了同样的问题并实施了几个解决方案,但只有在我将 pod 从 Firebase 4.1.0 更新到 Firebase 4.1.1 后它才有效。
此 git repo 还声称此错误已在此更新中修复。
您可以通过以下方式查看当前使用的版本: 'pod search FirebaseUI' 在项目路径位置的终端中,如果它不是最新版本,只需执行 'pod update',这有望解决问题。