首页 > 解决方案 > Swift - 从其他 ViewController 设置时,UIView 中的枚举显示为 nil

问题描述

我在使用这个 Firebase 应用程序时遇到了问题。我在 UIView 中有一个枚举,即使我在viewDidLoad(). UIView 只是一个标题视图,枚举通过一个switch语句来确定要为哪种用户类型显示哪个按钮。这是 UIView 的代码(缩短为仅显示必要的代码以提高可读性):

enum HeaderViewOptions: Int {
    case partner
    case client
}

class HeaderView: UIView {

    var options: HeaderViewOptions!

    //...

    override init(frame: CGRect) {
        super.init(frame: frame)

        //...

        switch options {
        case .partner:
            addSubview(addServiceButton)
            //...
        case .client:
            addSubview(searchButton)
            //...
        case .none:
            break
        }
    }
}

这是设置变量的 ViewController 中按顺序排列的一系列函数和变量的位置options

override func viewDidLoad() {
    super.viewDidLoad()
    checkUser()
}

func checkUser() {
    if Auth.auth().currentUser?.uid == nil {
        //...
    } else {
        configure()
    }
}

func configure() {
    //...
    fetchUserData()
    //...
}

func fetchUserData() {
    guard let currentUid = Auth.auth().currentUser?.uid else { return }
    Services.shared.fetchUserData(uid: currentUid) { user in
        self.user = user
    }
}

private var user: User? {
    didSet {
        if user?.accountType == .partner {
            headerView.options = .partner
        } else {
            headerView.options = .client
        }
    }
}

对象的accountType属性与类User具有相同的枚举选项HeaderView

标签: swiftfirebaseenumsswift5

解决方案


更新你的异步函数

func fetchUserData() {
    guard let currentUid = Auth.auth().currentUser?.uid else { return }
    Services.shared.fetchUserData(uid: currentUid) {[weak self] user in
        self?.user = user
       DispatchQueue.main.async {
        self?.configureButtonsInView() // add buttons here
        }
    }
}

推荐阅读