【问题标题】:"Could not load NIB" when subclassing FUIAuthPickerViewController子类化 FUIAuthPickerViewController 时“无法加载 NIB”
【发布时间】:2017-05-06 06:55:49
【问题描述】:

我能在网上找到的唯一相关问题是 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。

感谢任何帮助。

问候, 科恩

【问题讨论】:

    标签: ios swift firebase firebase-authentication firebaseui


    【解决方案1】:

    事实证明,这是 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
    

    【讨论】:

      【解决方案2】:

      FUIAuthPickerViewControllerUIViewController

      The init documentation 表示:

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

      The nibName documentation 说:

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

      1. 如果视图控制器类名称以单词“Controller”结尾,如在 MyViewController 中,它会查找名称与 不带“Controller”一词的类名,如 MyView.nib。

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

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

      【讨论】:

      • 这是有道理的,如果是这样的话,FirebaseUI 文档对这个过程非常模糊,说你需要做的就是子类化并实现一个委托方法。
      【解决方案3】:

      这似乎也是由 FirebaseUI 上的错误引起的,我遇到了同样的问题并实施了几个解决方案,但它仅在我将 pod 从 Firebase 4.1.0 更新到 Firebase 4.1.1 后才有效。

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-03-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多