从注释中获得帮助后,线程已解决。
我看到了与此相关的另一个线索,但是经过数小时的尝试,它并没有帮助我。因此,我别无选择地创建一个新线程。 (很抱歉)
在课程开始时,我要这样做:
//Firestore connection
let db = Firestore.firestore()
//Create an array of items to insert into pickerview
var dogsArray: [String] = []
在ViewDidLoad中,我已为pickerview委托和数据源。
override func viewDidLoad()
{
super.viewDidLoad()
getDogs()
self.pickerView.delegate = self
self.pickerView.dataSource = self
}
还有点失望,我得到了这段代码:
func numberOfComponents(in pickerView: UIPickerView) -> Int
{
return 1
}
func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String?
{
return dogsArray[row]
}
func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int
{
return dogsArray.count
}
func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int)
{
labeltest.text = dogsArray[row]
}
func getDogs()
{
db.collection("Dogs").getDocuments
{ (QuerySnapshot, err) in
if err != nil
{
print("Error getting documents: \(String(describing: err))");
}
else
{
for document in QuerySnapshot!.documents
{
let document = QuerySnapshot!.documents.first
let data = document!.data()
data.forEach { (item) in
if let dogOneData = data["Dog1"] as? String {
self.dogsArray.append(dogOneData)
}
if let dogTwoData = data["Dog2"] as? String {
self.dogsArray.append(dogTwoData)
}
if let dogThreeData = data["Dog3"] as? String {
self.dogsArray.append(dogThreeData)
}
}
self.pickerView.reloadAllComponents()
}
}
}
错误:无法转换“任何类型”的值?到关闭结果类型 '串?'返回(dogElement.value为?[字符串: 任何])?. values.first
因此,我试图从Firestore中选择数据并将其插入pickerview。但是我要选择的数据是我在应用程序上注册时输入的数据。所以每个人都是独一无二的。 (例如,如果您在该应用上注册,则您的狗名与我的狗名不同。)
因此,我正在尝试从特定用户中选择数据。但是我不知道该怎么办。结果目前是空白,我在pickerview中根本看不到任何数据。因此,我很乐意为此提供帮助!你会让我的星期五成为一个好日子。 :)
解决后的结果:
//Function getDogs()
func getDogs()
{
//Authentication
let authentication = Auth.auth().currentUser?.uid
//Choosing collection
db.collection("users").document(authentication!).collection("Dogs").getDocuments()
{ (QuerySnapshot, err) in
if err != nil
{
print("Error getting documents: \(String(describing: err))");
}
else
{
//For-loop
for _ in QuerySnapshot!.documents
{
self.dogsArray.removeAll()
let document = QuerySnapshot!.documents.first
let data = document!.data()
data.forEach { (item) in
if let dogOneData = data["Dog1"] as? String {
self.dogsArray.append(dogOneData)
}
if let dogTwoData = data["Dog2"] as? String {
self.dogsArray.append(dogTwoData)
}
if let dogThreeData = data["Dog3"] as? String {
self.dogsArray.append(dogThreeData)
}
}
self.pickerView.reloadAllComponents()
}
答案 0 :(得分:3)
您在委托函数上调用getData,因为它是不同步的,所以在调用其余委托函数之前不会加载它们。
您应该首先调用getData()
函数,然后重新加载PickerviewDataSource
例如,在viewDidAppear()
函数上调用
getDogs()
并在循环之后添加getDogs()
函数内部
dogsArray.removeAll()
let document = QuerySnapshot!.documents.first
let data = document.data()
data.forEach { (item) in
if let dogOneData = item["Dog1"] as? String {
dogsArray.append(dogOneData)
}
if let dogTwoData = item["Dog2"] as? String {
dogsArray.append(dogTwoData)
}
if let dogThreeData = item["Dog3"] as? String {
dogsArray.append(dogThreeData)
}
}
self.pickerView.reloadAllComponents()
答案 1 :(得分:2)
首先,您不应在getDogs
中调用titleForRow
在viewDidLoad
中调用
第二,您需要在循环后调用reload。
func getDogs()
{
db.collection("Dogs").getDocuments
{ (QuerySnapshot, err) in
if err != nil
{
print("Error getting documents: \(String(describing: err))");
}
else
{
for document in QuerySnapshot!.documents
{
let data = document.data()
let dogs = data["Dogs"] as? String ?? ""
self.dogsArray.append(dogs)
}
DispatchQueue.main.async
{
self.pickerView.reloadAllComponents()
}
}
}
}