pickerView 无法加载在同一视图控制器中获取的数据 (swift)
pickerView can't load data that fetch in same view controller (swift)
我的 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) {
}
你应该在 ws 响应后使用:
重新加载组件:
或
重新加载所有组件:
您需要调用self.pickerView.reloadAllComponents()
来触发刷新。然后将再次调用数据源方法,您更新的数据将显示在选择器视图中。
您的 Alamofire 请求 returns 是异步的,因此您应该在 self.confirms += confirm
之后触发重新加载。
注意:您也可以考虑使用 dispatch_async(dispatch_get_main_queue(), {...})
在主线程上触发它
我的 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) {
}
你应该在 ws 响应后使用:
重新加载组件:
或
重新加载所有组件:
您需要调用self.pickerView.reloadAllComponents()
来触发刷新。然后将再次调用数据源方法,您更新的数据将显示在选择器视图中。
您的 Alamofire 请求 returns 是异步的,因此您应该在 self.confirms += confirm
之后触发重新加载。
注意:您也可以考虑使用 dispatch_async(dispatch_get_main_queue(), {...})