"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。

感谢任何帮助。

此致, 科恩

FUIAuthPickerViewControllerUIViewController.

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.

The nibName documentation 说:

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:

  1. 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.

  2. 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',这有望解决问题。