【发布时间】:2019-07-02 18:28:54
【问题描述】:
基本上我有一个 textField 按下时需要打开一个 UIPickerView 并带有来自 JSON 的选择
在选择 UItextField 并在 Swift 中从 JSON 创建数组时,我分别处理了触发 UIPickerView 的工作,但在组合时遇到了一些麻烦。
对于JSON,我使用 Almofire 只是因为它简化了流程
UIPickerView 是通过编程方式编写的。
我正在使用的 JSON 如下所示:
[{“model”:”model1”},{“model":"model2”},
{“model":"model3”},{“model":"model4”},{“model":"model5”},{“model":"model6”}]
Almofire 目前看起来是这样的:
let url = NSURL(string: "https://www.test.com/test/test")
let data = NSData(contentsOf: url! as URL)
var tmpValues = try! JSONSerialization.jsonObject(with: data! as Data, options: JSONSerialization.ReadingOptions.mutableContainers) as! NSArray
tmpValues = tmpValues as NSArray
reloadInputViews()
for candidate in tmpValues {
if let cdict = candidate as? NSDictionary {
//model is the column name in sql/json
let model = cdict["model"]
self.values.append(model! as AnyObject)
}
}
使用以下代码触发textField 打开 UIPickerView:
import UIKit
class ViewController: UIViewController,UIPickerViewDataSource,UIPickerViewDelegate {
@IBOutlet weak var TextField: UITextField!
let model = ["model1","model2"]
var pickerview = UIPickerView()
override func viewDidLoad() {
super.viewDidLoad()
TextField.inputView = pickerview
TextField.textAlignment = .center
TextField.placeholder = "Select Your Model"
pickerview.delegate = self
pickerview.dataSource = self
// Do any additional setup after loading the view, typically from a nib.
}
func numberOfComponents(in pickerView: UIPickerView) -> Int {
return 1
}
func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
return Names.count
}
func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
return Names[row]
}
func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
TextField.text = Names[row]
}
}
如何用 JSON 响应替换硬编码数组?
【问题讨论】:
-
请不要在 Swift 中使用
NSURL、NSData、NSArray、NSDictionary、.mutableContainers和AnyObject(用于 JSON 数据)。使用本机类型。 Swift 变量名以小写字母开头。并且从不使用同步Data(contentsOf从远程 URL 加载数据。不要那样做。 -
我很欣赏这些指针,为什么“使用同步 Data(contentsOf”从远程 URL 加载数据是不好的
-
它阻塞了线程。这会导致糟糕的用户体验。想象一下服务器目前不可用......
标签: ios swift alamofire uipickerview uipickerviewcontroller