我以编程方式编写了以下UIPickerView来提取从JSON中获取的值。
基本上在选择customerTextField
时,我应该看到UIPickerView显示正在解析的链接中的值。
相反,我只看到一个键盘出现。
是否存在语法问题,我没有收到任何错误,UIPickerView根本就没有出现。
import UIKit
class CreateRMA_ViewController: UIViewController, UIPickerViewDataSource, UIPickerViewDelegate, UITextFieldDelegate {
@IBOutlet weak var customerTextField: UITextField!
var pickerView: UIPickerView!
var values: [AnyObject] = []
func numberOfComponents(in pickerView: UIPickerView) -> Int {
return 1
}
func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
return self.values.count
}
func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
let titleRow = (values[row] as? String)!
return titleRow
}
func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
if values.count > 0 && values.count >= row{
self.customerTextField.text = self.values[row] as? String
self.pickerView.isHidden = true
}
}
func textFieldDidBeginEditing(_ textField: UITextField) {
//when you select the text field the picker view will be visible
if(textField == self.customerTextField){
self.pickerView.isHidden = false
self.view.endEditing(true)
}
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
override func viewDidLoad() {
super.viewDidLoad()
pickerView = UIPickerView()
pickerView.dataSource = self
pickerView.delegate = self
//get the values from sql/Json
let url = NSURL(string: "https://www.example.com/test/test.php")
let data = NSData(contentsOf: url! as URL)
var tmpValues = try! JSONSerialization.jsonObject(with: data! as Data, options: JSONSerialization.ReadingOptions.mutableContainers) as! NSArray
tmpValues = tmpValues.reversed() as NSArray
reloadInputViews()
for candidate in tmpValues {
if let cdict = candidate as? NSDictionary {
//fullName is the column name in sql/json
let names = cdict["customer"]
self.values.append(names! as AnyObject)
}
}
}
}
在ViewDidLoad()
你创造了pickerView
,将delegate
和dataSource
设为自我,很好。但是你没有做过,你没有添加你的pickerView
作为UITextfield
的inputView
。这就是为什么你没有得到pickerView
这样做
override func viewDidLoad() {
// do your works
pickerView = UIPickerView()
pickerView.dataSource = self
pickerView.delegate = self
customerTextField.inputView = pickerView
}
你必须做另外的事情,删除与UIPickerView
中的textfieldDidBeginEditing
相关的块,不需要这样做。
你必须将textfield的inputView
作为pickerView
override func viewDidLoad() {
super.viewDidLoad()
pickerView = UIPickerView()
pickerView.dataSource = self
pickerView.delegate = self
customerTextField.inputView = pickerView
}