【问题标题】:Load data from server in PickerView IOS Swift 4.2在 PickerView IOS Swift 4.2 中从服务器加载数据
【发布时间】:2019-01-30 11:15:59
【问题描述】:

我正在开发 IOS 应用程序,我想在我的 PickerView 中显示来自服务器的数据。我对 Ios Development 很陌生,这就是为什么我很困惑如何在我的PickerView 中加载任何ParseObject 数据。我的 ParseObject 包含“标题”和“状态”值。我想在我的 PickerView 中显示来自 ParseObject 的“title”的值,所以稍后如果我点击 PickerView 我也可以得到那个 ParseObject。我的代码如下,请指导我如何在我的 PickerView 中显示 ParseObject 数据。

import Foundation
import UIKit
import Parse

class SignUpViewController: UIViewController, UIPickerViewDelegate, UIPickerViewDataSource {



    @IBOutlet weak var positionPickerOutlet: UIPickerView!
     var pickerData: [String] = [String]()
     var selectPositionsData: [PFObject] = [PFObject]()
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        self.positionPickerOutlet.delegate = (self as UIPickerViewDelegate)
        self.positionPickerOutlet.dataSource = (self as UIPickerViewDataSource)
        getPositionData()
    }

    @IBAction func cancelFunction(_ sender: Any) {

        dismiss(animated: true, completion: nil)
        print("Sign Up Canceled")

    }

    func pickerView(_ pickerView: UIPickerView,
                    numberOfRowsInComponent component: Int) -> Int {

        // Row count: rows equals array length.
        return pickerData.count
    }

    func numberOfComponents(in pickerView: UIPickerView) -> Int {
        return 1
    }
    func pickerView(_ pickerView: UIPickerView,
                    titleForRow row: Int,
                    forComponent component: Int) -> String? {

        // Return a string from the array for this row.
        return pickerData[row]
    }

// 这里我调用 ParseQuery 函数并获取 ParseObject 列表并将其放入我的 selectPositionsData 数组中。

    func getPositionData(){

              let parseQuery = PFQuery(className:"UserPosition")
                parseQuery.limit = 100
                parseQuery.order(byAscending: "createdAt")
                parseQuery.whereKey("status", equalTo: true)

        parseQuery.findObjectsInBackground { (objects :[PFObject]?, error: Error?) in
            if objects != nil {
                // do something with the array of object returned by the call
                for parseObject in objects! {
                    self.selectPositionsData.append(parseObject)
// Here I am putting parseObject "title" in my array.

self.pickerData.append(parseObject.value(forKey: "title") as! String)
                    }
                    print(self.selectPositionsData)
                    self.positionPickerOutlet.reloadAllComponents()
                } else {
                    print(error?.localizedDescription as Any)
                }
            }
        }

    }

【问题讨论】:

  • 你的 ViewController 符合 UIPickerViewDataSource 和 UIPickerViewDelegate 吗?我的猜测是它没有,因为您试图将“self”转换为 UIPickerViewDataSource 和 Delegate。换个方式问:你的 numberOfRowsInComponent 是否触发了?
  • @Teetz 感谢您的回复。没有 ViewController 没有扩展 UIPickerViewDataSource 和 UIPickerViewDelegate。我是否也必须使用这两个?
  • 编辑您的问题并向我们展示整个 ViewController(带有声明)。我认为您的 ViewController 应该符合 UIPickerViewDataSource。然后你不需要将 self 转换为 UIPickerViewDataSource (委托相同)
  • @Teetz 对不起.. 刚才我检查了一下.. 我正在使用它们。我正在编辑我的问题并将我的完整 ControllerView
  • 问题是您将数据解析为“self.selectPositionsData”,但 PickerView 的数据源是 pickerData(从您的代码中我可以看到它是空的)

标签: ios swift uipickerview


【解决方案1】:

从 selectPositionsData[] 中获取一个属于 index/row 的对象,并从 ParseObject 中获取其属性值。无需将字符串从 selectPositionsData[] 迭代到单独的标题数组。

func pickerView(_ pickerView: UIPickerView,
                    titleForRow row: Int,
                    forComponent component: Int) -> String? {

        // Return a string from the array for this row.
        return  selectPositionsData[row].value(forKey: "title")
    }

【讨论】:

    【解决方案2】:

    在您的 pickerViewDidSelect 方法中获取这样的值:

        func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
                let title = self.selectPositionsData[row].value(forKey: "title") as! String
                let status = self.selectPositionsData[row].value(forKey: "status") as! String
    
               let objectAtIndex = self.selectPositionsData[row]
            }
    

    【讨论】:

    • 感谢您在这里的回答。这项工作现已完成。您能否指导我点击 PickerView 时如何获取对象。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-15
    • 2016-11-10
    • 1970-01-01
    • 2016-05-20
    • 2015-01-17
    • 1970-01-01
    相关资源
    最近更新 更多