首页 > 解决方案 > 将数据从 AppDelegate 传递到 UIViewController

问题描述

如何将数据从 AppDelegate 类传递到自定义 ViewController?

import UIKit
import LocalAuthentication

class ViewController: UIViewController {
    public var config: PasscodeConfig!

    func GetAppDelegate(){
        print("\(self.config)") /// nil %(
    }

    override public func viewDidLoad() {
        super.viewDidLoad()

        self.GetAppDelegate()
}
...
}

不幸的是,变量配置返回 - nil AppDelegate:

   @UIApplicationMain
    class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?
    var appCoordinator: AppCoordinator!

    var code = ""
lazy var passcode: Passcode = {
    let config = PasscodeConfig(passcodeGetter: {
        return self.code
        // Return code as string
    }, passcodeSetter: { code in
        self.code = code
         // Save new code
    }, biometricsGetter: {
        return true
        // return Should use biometrics (Touch ID or Face ID) as Bool
    })

    let passcode = Passcode(window: self.window, config: config)

    return passcode
}()

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {

        window = UIWindow(frame: UIScreen.main.bounds)
        appCoordinator = AppCoordinator(window: window!)
        appCoordinator.start()

        self.passcode.authenticateWindow()

        return true
    }
...
}

PasscodeConfig 类

public class PasscodeConfig {

    var foreground = true
    var biometricsString: String?
    public var biometrics: String? { return biometricsString }
    public var autoBiometrics = false /// Флаг Включения Аутентификации по Биометрии

    public var reason: String?

    public var colors = PasscodeColors(dark: false, mainTint: UIColor(red: 0.0, green: 0.48, blue: 1.0, alpha: 1.0), buttonTint: .black, biometrics: (.white, UIColor(red: 0.0, green: 0.48, blue: 1.0, alpha: 1.0)), text: .black)

    public var passcodeGetter: (() -> String)
    public var passcodeSetter: ((String) -> Void)
    public var biometricsGetter: (() -> Bool)

    public init(passcodeGetter: @escaping (() -> String), passcodeSetter: @escaping ((String) -> Void), biometricsGetter: (() -> Bool)? = nil) {
        self.passcodeGetter = passcodeGetter
        self.passcodeSetter = passcodeSetter
        self.biometricsGetter = biometricsGetter ?? { true }
    }
}

public struct PasscodeColors {
    public var mainTint: UIColor
    public var buttonTint: UIColor
    public var biometrics: (UIColor, UIColor)
    public var text: UIColor
    public var dark: Bool

    public init(dark: Bool, mainTint: UIColor, buttonTint: UIColor? = nil, biometrics: (UIColor, UIColor)? = nil, text: UIColor) {
        self.mainTint = mainTint
        self.buttonTint = buttonTint ?? mainTint
        self.biometrics = biometrics ?? (text, mainTint)
        self.text = text
        self.dark = dark
    }

    public init() {
        self.mainTint = UIColor(red: 0.0, green: 0.48, blue: 1.0, alpha: 1.0) ///
        if #available(iOS 13.0, *) {
            self.buttonTint = .label
            self.biometrics = (.label, mainTint)
            self.text = .label
        } else {
            self.buttonTint = .black
            self.biometrics = (.black, mainTint)
            self.text = .black
        }
        self.dark = false
    }
}

此外,必须在加载 View 之前初始化变量config 。

我需要做什么?

提前致谢!

标签: iosswiftuiviewcontrollerappdelegate

解决方案


您可能希望将设置代码放在 AppDelegate 方法中,而不是作为惰性 var。

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool

你能张贴什么PasscodePasscodeConfig类的样子吗?


推荐阅读