swift - 从 json 中获取数据并显示在选择器中
问题描述
我试图从 json url 获取数据并显示在选择器中,它在 Swift 中第一次没有显示。请检查我的代码。
import UIKit
class PickerVC: UIViewController ,UIPickerViewDelegate, UIPickerViewDataSource, UITextFieldDelegate{
@IBOutlet weak var txtEmail: UITextField!
@IBOutlet weak var txtPassword: UITextField!
@IBOutlet weak var view1: UIView!
var myPickerView : UIPickerView!
// var pickerData = ["Hitesh Modi" , "Kirit Modi" , "Ganesh Modi" , "Paresh Modi"]
var pickerData: [String] = [String]()
override func viewDidLoad() {
super.viewDidLoad()
let emailImage = UIImage(named:"email")
addLeftImageTo(txtField: txtEmail, andImage: emailImage!)
let passwordImage = UIImage(named:"User")
addLeftImageTo(txtField: txtPassword, andImage: passwordImage!)
self.txtEmail.addTarget(self, action: #selector(self.textDidChange), for: UIControl.Event.editingDidEnd)
}
func pickUp(_ textField : UITextField){
print("pick up...T")
// UIPickerView
self.myPickerView = UIPickerView(frame:CGRect(x: 0, y: 0, width: self.view.frame.size.width, height: 216))
self.myPickerView.delegate = self
self.myPickerView.dataSource = self
self.myPickerView.backgroundColor = UIColor.white
textField.inputView = self.myPickerView
// ToolBar
let toolBar = UIToolbar()
toolBar.barStyle = .default
toolBar.isTranslucent = true
toolBar.tintColor = UIColor(red: 92/255, green: 216/255, blue: 255/255, alpha: 1)
toolBar.sizeToFit()
// Adding Button ToolBar
let doneButton = UIBarButtonItem(title: "Done", style: .plain, target: self, action: #selector(ViewController.doneClick))
let spaceButton = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil)
let cancelButton = UIBarButtonItem(title: "Cancel", style: .plain, target: self, action: #selector(ViewController.cancelClick))
toolBar.setItems([cancelButton, spaceButton, doneButton], animated: false)
toolBar.isUserInteractionEnabled = true
textField.inputAccessoryView = toolBar
}
//MARK:- PickerView Delegate & DataSource
func numberOfComponents(in pickerView: UIPickerView) -> Int {
print("no. of components...")
return 1
}
func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
print("no. of rows...")
return pickerData.count
}
func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
print("title for Row...")
return pickerData[row]
}
func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
print("did select picker...")
self.txtPassword.text = pickerData[row]
}
//MARK:- TextFiled Delegate
func textFieldDidBeginEditing(_ textField: UITextField) {
print("did Edit...")
// self.txtEmail.addTarget(self, action: #selector(self.textDidChange), for: UIControl.Event.editingDidEnd)
self.pickUp(txtPassword)
//getDaTa()
}
//MARK:- Button
@objc func doneClick() {
txtPassword.resignFirstResponder()
}
@objc func cancelClick() {
// txtPassword.resignFirstResponder()
}
@objc func textDidChange(_ textField:UITextField) {
print("text did change called....")
var value=self.txtEmail.text!
//start
let url = URL(string: "http://www.json-generator.com/api/json/get/ceBRtExBaq?indent=2")!
var request = URLRequest(url: url, cachePolicy: .reloadIgnoringCacheData,timeoutInterval: 10000)
URLSession.shared.dataTask(with: request) { (data, response, error) in
if error != nil {
print(error!)
return
}
do {
if let jsonData = try JSONSerialization.jsonObject(with:data!, options: []) as? [String:AnyObject] {
print("json:\(jsonData)")
DispatchQueue.main.async {
// self.pickUp(self.txtPassword)
if let pumpData = jsonData["User"] as? [[String:AnyObject]] {
for i in pumpData{
self.pickerData.append(String(describing:i["Type"]!))
self.pickUp(self.txtPassword)
}
}
}
}
}
catch let error as NSError {
print(error)
}
}.resume()
//end
}
}
解决方案
从 url 获取数据时,您应该使用 MVC 模式,使用委托,重新加载您的 pickerView。
这是我的协议:
protocol DataSourceDelegate {
func categoriesLoaded(categories: [Category])
}
这是我的获取功能:
func loadCategories(monthID: Int) {
let session = URLSession.shared
let request = URLRequest(url: URL(string: "http://manage.littlesleeperapp.com/api/v1/tip_category/get_categories_tips_by_segment_id/\(monthID)")!)
session.dataTask(with: request) { (data, response, error) in
if (response as? HTTPURLResponse) != nil {
let jsonData = try! JSONDecoder().decode(Dictionary<String, [Category]>.self, from: data!)
let categories = jsonData["data"]!
self.categories = categories
self.delegate?.categoriesLoaded(categories: categories)
}
}.resume()
}
当提取完成时,categoryLoaded 委托被调用。
并重新加载 tableView
extension TipsViewController: DataSourceDelegate {
func categoriesLoaded(categories: [Category]) {
DispatchQueue.main.async {
self.categories = categories
self.myTableView.reloadData()
self.activityIndicator.stopAnimating()
}
}
}
推荐阅读
- javascript - 如何在循环内声明类副本
- yaml - YAML - 获取有关新 yaml 属性的数据
- mongodb - MongoDB 平均返回 NULL
- cassandra - Cassandra 删除节点并单独使用它
- vue.js - Vue Draggable move方法中的访问属性
- xamarin.forms - 无法完成将 xamarin.froms.android 应用添加到 firebase
- python - 如何使用 nlargest 分组并保留所有列?
- css - 如何在 Material 的 Popover 组件中制作子菜单
- c# - 未定义或导入预定义类型 System.Range
- python - socket recv 永远挂起或超时