微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在文本字段中显示学校 ID?

如何解决如何在文本字段中显示学校 ID?

我想在某个视图控制器的文本字段中显示学校 ID,但由于某种原因我不能。我有一个函数可以获取当前学校用户的学校 ID,我可以在 alertVC 中显示它,但不能在常规 VC 中显示它。我会添加图片和说明。

首先,我将展示获取当前用户的学校 ID 并将其显示在 alertVC 中的函数代码

  func getTheSchoolsID() -> String {
    db.collection("school_users").whereField("userID",isEqualTo: user?.uid).getDocuments { (querySnapshot,err) in
        if let err = err {
            print("There was an error fetching the documents: \(err)")
        } else {
            self.skoolsID = querySnapshot!.documents.map { document in
                return SchoolID(schoolID: (document.get("school_id") as! String ?? ""))
            }
            self.tableView.reloadData()
        }
    }
    let fixID = "\(skoolsID)"
    let substring = fixID.dropFirst(28).dropLast(3)
    let realString = String(substring)
    
    return realString
}

这里也是 alertVC 的代码

@IBAction func infopressed(_ sender: UIBarButtonItem) {
    var text = UITextField()
    
    let alert = UIAlertController(title: "User Info",message: "School ID",preferredStyle: .alert)
    let action = UIAlertAction(title: "dismiss",style: .cancel) { (action) in
        self.dismiss(animated: true,completion: nil)
    }
    alert.addTextField { (alertTextField) in
        alertTextField.text = self.getTheSchoolsID()
        alertTextField.isEnabled = false
       
        
        
    }
    alert.addAction(action)
    present(alert,animated: true,completion: nil)
}

这两个产生了这个结果。

Positive Outcome

这也是文档中的确切 school_id。

现在,当我想在我添加新事件的另一个 VC 的文本字段中显示这个完全相同的值时,它什么也不显示

Negative Outcome

代码与第一个代码片段完全相同,除了 reloadData() 是有意义的,并且不会产生相同的结果。

func getTheSchoolID() -> String {
    db.collection("school_users").whereField("userID",err) in
        if let err = err {
            print("There was an error fetching the documents: \(err)")
        } else {
            self.skoolID = querySnapshot!.documents.map { document in
                return SchoolID(schoolID: (document.get("school_id") as! String ?? ""))
            }
        }
    }

   
    
    let fixedID = "\(skoolID)"
    let substring = fixedID.dropFirst(28).dropLast(3)
    let realString = String(substring)
    return realString
}

这里我也想声明一下。

   public override func viewDidLoad() {
    super.viewDidLoad()
    
    errLabel.alpha = 0
    
    getTheSchoolID()
    
    
    
    schoolIDTextF.text = getTheSchoolID()
    // Do any additional setup after loading the view.
}

如果有人能帮助解决这个问题,我们将不胜感激。我尽量解释清楚。我知道有很多信息,但如果您还需要更多信息,我可以在评论中澄清。谢谢。

解决方法

问题在于异步 Firebase 代码。使用闭包或完成处理程序来获取结果。

将您的 getSchoolId 修改为

    func getTheSchoolID(completion: @escaping ((String?) -> ())) {
        db.collection("school_users").whereField("userID",isEqualTo: user?.uid).getDocuments { (querySnapshot,err) in
            if let err = err {
                print("There was an error fetching the documents: \(err)")
                completion(nil)
            } else {
                self.skoolID = querySnapshot!.documents.map { document in
                    return SchoolID(schoolID: (document.get("school_id") as! String ?? ""))
                }
            }
        }
        
        let fixedID = "\(skoolID)"
        let substring = fixedID.dropFirst(28).dropLast(3)
        let realString = String(substring)
        completion(realString)
    }

在您的 VC 中,将其用作

override func viewDidLoad() {
    super.viewDidLoad()
    
    errLabel.alpha = 0
    
    getTheSchoolID(completion: {
       [weak self] schoolId in
        if let id = schooldId {
          DispatchQueue.main.async {
            self?.schoolIDTextF.text = id 
          }
        }
    })
}
,

Firestore 集合中的 GetSchoolIds 是异步任务。所以使用闭包你可以做到这一点。

  func getTheSchoolsID(completion:@escaping(_ schoolIds:[SchoolID]?) -> Void) {
        db.collection("school_users").whereField("userID",err) in
            if let err = err {
                print("There was an error fetching the documents: \(err)")
                completion(nil)
            } else {
                let schoolsId = querySnapshot!.documents.map { document in
                    return SchoolID(schoolID: (document.get("school_id") as! String ?? ""))
                }
                completion(schoolsId)
            }
        }
    }

将此功能用于您的 VC

override func viewDidLoad() {
    super.viewDidLoad()
    
    errLabel.alpha = 0
    
    getTheSchoolsID(completion: {
       [weak self] schoolIds in
        if let schoolIdObj = schoolIds?.first {
        let substring = schoolIdObj.schoolID.dropFirst(28).dropLast(3)
        let realString = String(substring)

          DispatchQueue.main.async {
            self?.schoolIDTextF.text = realString 
          }
        }
    })
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。