【问题标题】:pickerView can't load data that fetch in same view controller (swift)pickerView 无法加载在同一视图控制器中获取的数据(swift)
【发布时间】:2016-05-20 20:10:54
【问题描述】:

我的 pickerview 无法从在同一视图控制器中获取的数组中加载数据。但是如果我将fetchHistory 放在另一个viewController 中(就在historyViewController 之前)并通过导航发送数据,pickerView 会显示confirms 数据。当我将fetchHistory 放入historyViewController 时如何使其工作?或者有什么建议最好的方法是把fetchHistory 放在随机的viewController 中?

historyViewController

var confirms = [DataWaitingConfirm]() //pickerView DataSource
override func viewDidLoad() {
    super.viewDidLoad()

    fetchHistory()//fetch data from server for 'confirms'
}

fetchData

func fetchHistory(){

    let headers = ["Authorization" : "\(TokenType!) \(Token!)"]
    Alamofire.request(.GET, "http://xxxx/history/", headers: headers, encoding: .JSON).responseJSON { response in
              switch response.result {
                  case .Success:
                     if let value = response.result.value {
                         let json = JSON(value)
                         print(json)
                         for (results,subJson):(String, JSON) in json["results"] {
                         print(subJson["status"].int)
                         if subJson["status"].intValue == 3 {
                             print("ada 3")
                             let orderReference = subJson["px_reference"].stringValue
                             let date = subJson["invoice_date_str"].stringValue
                             let totalPaid = subJson["total_paid"].stringValue

                             let orderPicker = "\(orderReference) \(date) \(totalPaid)"
                             let confirm = DataWaitingConfirm(orderReference: orderReference, pickerConfirm: orderPicker)
                             self.confirms += [confirm]
                                            }
                                        }}

            }
        case .Failure(let error):
            spinningActivity.hide(true)
            print(error)
            self.displayAlertMessage("could not fetch history")
        }
    }
}

pickerview 委托

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

    let orderToConfirm = confirms[row]
    return orderToConfirm.pickerConfirm
}

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


    return confirms.count
}

func numberOfComponentsInPickerView(pickerView: UIPickerView) -> Int {
    return 1
}

func pickerView(pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {

}

【问题讨论】:

    标签: ios swift uipickerview datamodel


    【解决方案1】:

    你应该在ws响应之后使用:

    重新加载组件:

    重新加载所有组件:

    【讨论】:

      【解决方案2】:

      您需要调用self.pickerView.reloadAllComponents() 来触发刷新。然后将再次调用数据源方法,更新后的数据将出现在选择器视图中。

      您的 Alamofire 请求异步返回,因此您应该在 self.confirms += confirm 之后触发重新加载。

      注意:您也可以考虑使用dispatch_async(dispatch_get_main_queue(), {...})在主线程上触发它

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-02-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-09-21
        • 1970-01-01
        相关资源
        最近更新 更多