"无法加载NIB"在子类化FUIAuthPickerViewController时

时间:2016-12-20 23:24:58

标签: ios swift firebase firebase-authentication firebaseui

我在网上找到的唯一相关问题是关于GitHub的问题报告: https://github.com/firebase/FirebaseUI-iOS/issues/128

然而,似乎没有任何解决方案。

使用FirebaseUI,我希望继承FUIAuthPickerViewController,以便我可以稍微自定义它。当我继承并调用FUIAuth.defaultAuthUI!.authViewController时,我得到以下运行时异常:

  

' NSInternalInconsistencyException',原因:'无法在捆绑中加载NIB

我是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,如果没有定义它。

感谢任何帮助。

此致 科恩

3 个答案:

答案 0 :(得分:5)

事实证明,这是FirebaseUI中的一个错误,它已从旧版本重新出现。

可以跟踪问题here

临时解决方案是在FUIAuthPickerController子类中对正确的NIB名称进行硬编码:

夫特:

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()
    }

}

目标-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

答案 1 :(得分:0)

var datetime = DateTime.Now; var newDateTime = datetime.AddHours(DateTime.Parse("6:00 PM").Hour); FUIAuthPickerViewController

该课程的

The init documentation说:

  

如果为nibName参数指定nil并且未覆盖loadView()方法,则视图控制器将按照nibName属性中的描述搜索nib文件。

The nibName documentation说:

  

具体来说,它会查找具有适当名称的nib文件   (没有.nib扩展名)并在其视图时加载该nib文件   请求。具体来说,它(按顺序)查找带有的nib文件   以下名称之一:

     
      
  1. 如果视图控制器类名以“Controller”结尾,如在MyViewController中,它会查找名称与之匹配的nib文件   没有单词'Controller'的类名,如MyView.nib。

  2.   
  3. 它查找名称与视图控制器类名称匹配的nib文件。例如,如果类名是MyViewController,   它查找MyViewController.nib文件。

  4.   

这里没有任何暗示它会检查nib的所有超类的名称。我假设它正在检查“AuthView.nib”和“AuthViewController.nib”,然后放弃。

答案 2 :(得分:0)

这似乎也是由FirebaseUI上的一个错误引起的,我遇到了同样的问题并实现了几个解决方案,但只有在我从Firebase 4.1.0更新到Firebase 4.1.1之后才能工作。

此git repo也声称此更新中已修复该错误。

您可以通过以下方式查看您当前所处的版本: ' pod搜索FirebaseUI'在项目路径位置的终端中,如果它不是最新版本,只需执行“更新”即可。这有希望解决问题。