Swift 3 中的 UIPickerView 和子类数组

Posted

技术标签:

【中文标题】Swift 3 中的 UIPickerView 和子类数组【英文标题】:UIPickerView and subclass Array in Swift 3 【发布时间】:2016-12-11 17:12:45 【问题描述】:

我是 Swift 和 Firebase 的新手,但我正在构建一个应用程序,它在一个视图控制器中使用选择器视图,并且填充它的数据来自 Firebase 结构,该结构将数据放入数组中,参数存储在子类中。

我可以看到在调试器控制台中打印的所有数据(Firebase 在这里运行正常)向我显示数组从 Firebase 接收到数据(并且我可以使用此方法插入新项目,并在此新控制器中使用按钮太),但看起来pickerview的方法(numberOfCOmponentsnumberOfRowsInComponenttitleforRow)在viewDidLoad之前初始化,其中将数据从Firebase带到数组的方法发生,我有一个@ 987654325@.

我的选择器视图保持为空。我没有崩溃。在调试器控制台上,我可以看到打印出来的 count = 0,然后在 viewDidLoad 方法的末尾放置一个 print,它会计算我实际拥有的寄存器数量并显示它们。

我想知道在 pickeview 方法执行之前我应该​​如何使用 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)]

【问题讨论】:

【参考方案1】:

我可以在 viewDidLoad 方法中添加以下行来解决这个问题:

self.pckProfessores.reloadAllComponents()

就在self.refw2 = newTeste2 行之后。

【讨论】:

【参考方案2】:

和我的朋友一起,我们使用积木解决了这个问题。

我们创建一个类来管理这个类中的所有 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 检索调查

【讨论】:

谢谢@Sebitas。我现在可以只用一行来解决它:self.pckProfessores.reloadAllComponents() inside viewDidLoad 就在self.refw2 = newTeste2 之后。不管怎么说,还是要谢谢你。我会研究你的答案,我相信它会教给我很多东西。

以上是关于Swift 3 中的 UIPickerView 和子类数组的主要内容,如果未能解决你的问题,请参考以下文章

如何在 iOS Swift 3 中滚动到 UIPickerView 中的特定行

UIPickerView不显示数据Swift 3

Swift:如何为 UIPickerView 中的行分配不同的数值?

如何使用 Swift 3 UIPickerView 引用多行?

如何在 Swift 3 的 UIPickerView 中获取所选行的字符串值?

Swift 中的第一个 iOS 应用程序 - UIPickerView 中的问号