【问题标题】:Trying to customise FUIAuthPickerViewController and getting error in AppDelegate尝试自定义 FUIAuthPickerViewController 并在 AppDelegate 中出现错误
【发布时间】:2017-06-20 10:04:47
【问题描述】:

我正在尝试自定义 FUIAuthPickerViewController,以便我可以使用 FirebaseUI 身份验证将自定义身份验证屏幕作为我的登录屏幕

*** 由于未捕获的异常“NSGenericException”而终止应用程序,原因:“此编码器要求从 initWithCoder 返回替换的对象:”

我知道有一个错误阻止 FUIAuthPickerViewController 成为根视图控制器,所以在 Main.Storyboard 我添加了一个空白视图控制器并将类设置为我的 CustomLoginViewController 哪个子类 FUIAuthPickerViewController

想知道是否有人能指出我正确的方向?不知道为什么会出现这个错误。

谢谢

import UIKit
import FirebaseAuth
import FirebaseAuthUI

class CustomLoginViewController: 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()
}

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)

    if !isUserSignedIn() {
        showLoginView()
    }
}

private func isUserSignedIn() -> Bool {
    guard FIRAuth.auth()?.currentUser != nil else { return false }
    return true
}

private func showLoginView() {
    if let authVC = FUIAuth.defaultAuthUI()?.authViewController() {
        present(authVC, animated: true, completion: nil)
    }
}

这是我的 AppDelegate.swift

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate, FUIAuthDelegate {

var window: UIWindow?
var storyboard: UIStoryboard?
var authUI: FUIAuth?

let providers: [FUIAuthProvider] = [
    FUIGoogleAuth(),
    FUIFacebookAuth()
]

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    // Override point for customization after application launch.
    FIRApp.configure()

    authUI = FUIAuth.defaultAuthUI()
    authUI?.delegate = self
    authUI?.providers = providers

    return true
}

func authUI(_ authUI: FUIAuth, didSignInWith user: FIRUser?, error: Error?) {
    print("SIGNED IN")
}

public func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool {
    let handled = SDKApplicationDelegate.shared.application(app, open: url, options: options)

    return handled || GIDSignIn.sharedInstance().handle(url, sourceApplication: options[UIApplicationOpenURLOptionsKey.sourceApplication] as? String, annotation: options[UIApplicationOpenURLOptionsKey.annotation])
}

func authPickerViewController(forAuthUI authUI: FUIAuth) -> FUIAuthPickerViewController {
    return CustomLoginViewController(authUI: authUI)
}

这是完整的调用堆栈

*** Terminating app due to uncaught exception 'NSGenericException', reason: 'This coder requires that replaced objects be returned from initWithCoder:'
*** First throw call stack: (   0   CoreFoundation                      0x00000001065c1d4b __exceptionPreprocess + 171  1   libobjc.A.dylib    0x000000010602321e objc_exception_throw + 48     2   CoreFoundation       0x000000010662b2b5 +[NSException raise:format:] + 197  3   UIKit       0x0000000104dda1eb UINibDecoderDecodeObjectForValue + 758   4   UIKit   0x0000000104dd9eee -[UINibDecoder decodeObjectForKey:] + 98     5   UIKit 0x0000000104be5d14 -[UIRuntimeConnection initWithCoder:] + 178    6   UIKit                               0x0000000104dda1a1 UINibDecoderDecodeObjectForValue + 684   7   UIKit                      0x0000000104dda357 UINibDecoderDecodeObjectForValue + 1122   8   UIKit  0x0000000104dd9eee -[UINibDecoder decodeObjectForKey:] + 98  9   UIKit 0x0000000104be4eb8 -[UINib instantiateWithOwner:options:] + 1249  10  UIKit                               0x0000000104fa4f7b -[UIStoryboard instantiateViewControllerWithIdentifier:] + 181   11  UIKit             0x00000001047d747d -[UIApplication
_loadMainStoryboardFileNamed:bundle:] + 111     12  UIKit                               0x00000001047d7947 -[UIApplication _loadMainInterfaceFile] + 260    13  UIKit                               0x00000001047d5fa8 -[UIApplication
_runWithMainScene:transitionContext:completion:] + 1406     14  UIKit                               0x00000001047d326d -[UIApplication workspaceDidEndTransaction:] + 188   15  FrontBoardServices                  0x000000010925a6cb
__FBSSERIALQUEUE_IS_CALLING_OUT_TO_A_BLOCK__ + 24   16  FrontBoardServices                  0x000000010925a544
-[FBSSerialQueue _performNext] + 189    17  FrontBoardServices                  0x000000010925a8cd -[FBSSerialQueue _performNextFromRunLoopSource] + 45     18  CoreFoundation                      0x0000000106566761
__CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 17     19  CoreFoundation                      0x000000010654b98c
__CFRunLoopDoSources0 + 556     20  CoreFoundation                      0x000000010654ae76 __CFRunLoopRun + 918     21  CoreFoundation            0x000000010654a884 CFRunLoopRunSpecific + 420     22  UIKit               0x00000001047d1aea -[UIApplication _run] + 434  23  UIKit              0x00000001047d7c68 UIApplicationMain + 159   24  Surfshop               0x0000000100f54cbf main + 111    25  libdyld.dylib                       0x00000001073e968d start + 1    26  ???                                 0x0000000000000001 0x0 + 1 ) libc++abi.dylib: terminating with uncaught exception of type NSException

【问题讨论】:

    标签: ios swift firebase firebase-authentication firebaseui


    【解决方案1】:

    通过创建一个名为 MyViewController 的 UIViewController 的新子类并将故事板中的类属性设置为 MyViewController 而不是 CustomLoginViewController 来解决问题

    【讨论】:

    • 只有 2 年后,但是.. 你有没有机会澄清你的答案,因为我已经打了same problem?如果您将故事板中的类属性设置为MyViewController,那如何触发子类FUIAuthPickerViewController
    猜你喜欢
    • 2019-01-13
    • 1970-01-01
    • 2019-11-09
    • 1970-01-01
    • 2021-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-27
    相关资源
    最近更新 更多