【问题标题】:How to display school ID in the textfield?如何在文本字段中显示学校 ID?
【发布时间】:2021-02-10 15:34:39
【问题描述】:

我想在某个视图控制器的文本字段中显示学校 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)
}

这两个产生了这个结果。

这也是文档中的确切 school_id。

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

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

func getTheSchoolID() -> 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.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.
}

如果有人能帮助解决这个问题,我们将不胜感激。我试图尽可能地解释它。我知道有很多信息,但是如果您仍然需要更多信息,我可以在 cmets 中澄清。谢谢。

【问题讨论】:

  • 数据库访问异步工作。您必须重构 getTheSchoolID() 并添加一个完成处理程序。无法return收到的字符串。
  • 你能不能只添加一个你在说什么的代码sn-p? @vadian
  • 在函数本身中:func getTheSchoolID(completion: @escaping (String)->Void) {...
  • 请搜索 swift firebase 完成处理程序。有很多很多的例子。
  • 抱歉,我对 Firebase 不是特别熟悉。

标签: swift firebase google-cloud-firestore field nested-documents


【解决方案1】:

来自 firestore 集合的 GetSchoolIds 是异步任务。所以使用闭包可以实现这一点。

  func getTheSchoolsID(completion:@escaping(_ schoolIds:[SchoolID]?) -> Void) {
        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 {
                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 
          }
        }
    })
}

【讨论】:

    【解决方案2】:

    问题在于异步 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 
              }
            }
        })
    }
    

    【讨论】:

    • 由于某种原因它仍然无法正常工作。 @udbhateja 也出现了一个错误,所以我把@escaping 放在参数值之前。
    • 对不起,我的错误。我正在编辑我的回复。
    • 不用担心。 @udbhateja
    • 还是没有运气。感谢您尝试提供帮助。 @Ronak
    猜你喜欢
    • 1970-01-01
    • 2018-06-24
    • 1970-01-01
    • 2016-09-23
    • 1970-01-01
    • 1970-01-01
    • 2014-03-27
    • 1970-01-01
    • 2011-01-26
    相关资源
    最近更新 更多