Swift 3 中的 UIPickerView 和子类 Array
UIPickerView and subclass Array in Swift 3
我是 Swift 和 Firebase 的新手,但我正在构建一个应用程序,它在一个视图控制器中使用一个选择器视图,填充它的数据来自一个 Firebase 结构,该结构将数据放入一个数组中存储在子类中的参数。
我可以看到调试器控制台中打印的所有数据,(Firebase 可以 运行 在这里)向我显示数组从 Firebase 接收数据(我可以使用一种方法插入新项目这个新控制器中也有一个按钮),但看起来 pickerview 的方法(numberOfCOmponents
、numberOfRowsInComponent
和 titleforRow
)在 viewDidLoad
之前初始化,其中带来的方法从 Firebase 到数组的数据发生了,我有一个 count = 0
.
我的选择器视图仍然是空的。我没有崩溃。在调试器控制台,我可以看到打印的 count = 0
,然后在 viewDidLoad
方法的末尾放置一个 print
,它会计算我实际拥有的寄存器数量并显示它们。
我想知道在 pickerview 方法执行之前我应该如何使用 Firebase 数据填充数组,并且这些数据与 pickerview 行有关。谢谢。
var refw2: [PickerArrayClasses] = []
@IBOutlet weak var pckProfessores: UIPickerView!
override func viewDidLoad() {
super.viewDidLoad()
let refW = FIRDatabase.database().reference().child("avaliacao").child("equipe")
refW.queryOrdered(byChild: "nomePreceptor").observe(.value, with: {(snapshot) in
var newTeste2: [PickerArrayClasses] = []
for resposta in snapshot.children {
let itemsAadicionar = PickerArrayClasses(snapshot: resposta as! FIRDataSnapshot)
newTeste2.append(itemsAadicionar)
}
self.refw2 = newTeste2
print("ITENS NO ARRAY RefW2 \(newTeste2)")
})
self.pckProfessores.delegate = self
self.pckProfessores.dataSource = self
self.pckAvaliador.delegate = self
self.pckAvaliador.dataSource = self
}
func numberOfComponents(in pickerView: UIPickerView) -> Int {
return 1
}
func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
print("CONTAR ITENS NO REFW2 - SECAO COUNT = \(refw2.count)")
return refw2.count
}
func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
return refw2[row].nomePrecep
}
func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
let PreceptorEscolhido = refw2[row].nomePrecep
print("PRECEPTOR ESCOLHIDO: \(PreceptorEscolhido)")
}
调试器控制台中的信息
CONTAR ITENS NO REFW2 - SECAO COUNT = 0
ITENS NO ARRAY RefW2
[ChkList.PickerArrayClasses(nomePrecep: Optional("2222222222"), key: -KYiOkUH1cFXj7q7LkTi),
ChkList.PickerArrayClasses(nomePrecep: Optional("33333"), key: -KYiOvOjfxZpuUkxM4bn),
ChkList.PickerArrayClasses(nomePrecep: Optional("5555555555555555555"), key: -KYiPsHTumA0qdTKkbMT),
ChkList.PickerArrayClasses(nomePrecep: Optional("77777"), key: -KYikQ5dveM3L7JielTt),
ChkList.PickerArrayClasses(nomePrecep: Optional("MARK BONINHA"), key: -KYi7XofWn9Um6FVV3M6),
ChkList.PickerArrayClasses(nomePrecep: Optional("OUTRO MARK"), key: -KYi7t6OEllWTmMl655T),
ChkList.PickerArrayClasses(nomePrecep: Optional("dfddf"), key: -KYiI8sTLE6G3olzOtAJ)]
我们和我的朋友一起使用积木解决了这个问题。
我们创建一个 class 来管理此 class 中的所有 firebase 执行,我们生成如下方法:
class FirebaseManager {
func monitor(surveyWithId id: String, handler: @escaping (Entity?) -> Void) -> Block {
return observe(FIRDatabase.database().reference().child(Survey.path).child(id)) {
snapshot in
firebaseManagerQueue.async {
guard let dictionary: [AnyHashable: Any] = snapshot.value as? [AnyHashable: Any] else {
DispatchQueue.main.async {
handler(nil)
}
return
}
let survey = Survey(id: snapshot.key, dictionary: dictionary)
DispatchQueue.main.async {
handler(survey)
}
}
}
}
}
所以你需要做的就是在你的视图控制器中调用这个方法:
firebaseManager.monitor(surveyWithId: surveyId) {
[weak self] entity in
guard let controller = self,
let survey = entity as? Survey else {
return
}
并且在此块中,您应该能够重新加载您的 pickerview。
在此代码中,我们从 firebase 检索调查
我可以在 viewDidLoad 方法中添加以下行来解决这个问题:
self.pckProfessores.reloadAllComponents()
就在 self.refw2 = newTeste2
行之后。
我是 Swift 和 Firebase 的新手,但我正在构建一个应用程序,它在一个视图控制器中使用一个选择器视图,填充它的数据来自一个 Firebase 结构,该结构将数据放入一个数组中存储在子类中的参数。
我可以看到调试器控制台中打印的所有数据,(Firebase 可以 运行 在这里)向我显示数组从 Firebase 接收数据(我可以使用一种方法插入新项目这个新控制器中也有一个按钮),但看起来 pickerview 的方法(numberOfCOmponents
、numberOfRowsInComponent
和 titleforRow
)在 viewDidLoad
之前初始化,其中带来的方法从 Firebase 到数组的数据发生了,我有一个 count = 0
.
我的选择器视图仍然是空的。我没有崩溃。在调试器控制台,我可以看到打印的 count = 0
,然后在 viewDidLoad
方法的末尾放置一个 print
,它会计算我实际拥有的寄存器数量并显示它们。
我想知道在 pickerview 方法执行之前我应该如何使用 Firebase 数据填充数组,并且这些数据与 pickerview 行有关。谢谢。
var refw2: [PickerArrayClasses] = []
@IBOutlet weak var pckProfessores: UIPickerView!
override func viewDidLoad() {
super.viewDidLoad()
let refW = FIRDatabase.database().reference().child("avaliacao").child("equipe")
refW.queryOrdered(byChild: "nomePreceptor").observe(.value, with: {(snapshot) in
var newTeste2: [PickerArrayClasses] = []
for resposta in snapshot.children {
let itemsAadicionar = PickerArrayClasses(snapshot: resposta as! FIRDataSnapshot)
newTeste2.append(itemsAadicionar)
}
self.refw2 = newTeste2
print("ITENS NO ARRAY RefW2 \(newTeste2)")
})
self.pckProfessores.delegate = self
self.pckProfessores.dataSource = self
self.pckAvaliador.delegate = self
self.pckAvaliador.dataSource = self
}
func numberOfComponents(in pickerView: UIPickerView) -> Int {
return 1
}
func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
print("CONTAR ITENS NO REFW2 - SECAO COUNT = \(refw2.count)")
return refw2.count
}
func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
return refw2[row].nomePrecep
}
func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
let PreceptorEscolhido = refw2[row].nomePrecep
print("PRECEPTOR ESCOLHIDO: \(PreceptorEscolhido)")
}
调试器控制台中的信息
CONTAR ITENS NO REFW2 - SECAO COUNT = 0
ITENS NO ARRAY RefW2
[ChkList.PickerArrayClasses(nomePrecep: Optional("2222222222"), key: -KYiOkUH1cFXj7q7LkTi),
ChkList.PickerArrayClasses(nomePrecep: Optional("33333"), key: -KYiOvOjfxZpuUkxM4bn),
ChkList.PickerArrayClasses(nomePrecep: Optional("5555555555555555555"), key: -KYiPsHTumA0qdTKkbMT),
ChkList.PickerArrayClasses(nomePrecep: Optional("77777"), key: -KYikQ5dveM3L7JielTt),
ChkList.PickerArrayClasses(nomePrecep: Optional("MARK BONINHA"), key: -KYi7XofWn9Um6FVV3M6),
ChkList.PickerArrayClasses(nomePrecep: Optional("OUTRO MARK"), key: -KYi7t6OEllWTmMl655T),
ChkList.PickerArrayClasses(nomePrecep: Optional("dfddf"), key: -KYiI8sTLE6G3olzOtAJ)]
我们和我的朋友一起使用积木解决了这个问题。
我们创建一个 class 来管理此 class 中的所有 firebase 执行,我们生成如下方法:
class FirebaseManager {
func monitor(surveyWithId id: String, handler: @escaping (Entity?) -> Void) -> Block {
return observe(FIRDatabase.database().reference().child(Survey.path).child(id)) {
snapshot in
firebaseManagerQueue.async {
guard let dictionary: [AnyHashable: Any] = snapshot.value as? [AnyHashable: Any] else {
DispatchQueue.main.async {
handler(nil)
}
return
}
let survey = Survey(id: snapshot.key, dictionary: dictionary)
DispatchQueue.main.async {
handler(survey)
}
}
}
}
}
所以你需要做的就是在你的视图控制器中调用这个方法:
firebaseManager.monitor(surveyWithId: surveyId) {
[weak self] entity in
guard let controller = self,
let survey = entity as? Survey else {
return
}
并且在此块中,您应该能够重新加载您的 pickerview。
在此代码中,我们从 firebase 检索调查
我可以在 viewDidLoad 方法中添加以下行来解决这个问题:
self.pckProfessores.reloadAllComponents()
就在 self.refw2 = newTeste2
行之后。