2017-03-22 8 views
0

これらのJSON出力はPHPを使用しています。スウィフトはSwift 3.0のUIPickerViewを使用してJSONをUILabelに表示する方法は?

[ 
    {"number":"001","name":"MIKE"}, 
    {"number":"002","name":"JOSH"} 
] 

、私は「名前」値を選択して、以下のようUIPickerViewにそれを表示することができました。

DropdownJSON.swiftは

import UIKit 

class DropdownJSON: UIViewController, UIPickerViewDelegate, UIPickerViewDataSource, UITextFieldDelegate { 
    @IBOutlet var dropdownTxt: UITextField! 
    @IBOutlet var dropdownPV: UIPickerView! 

    @IBOutlet var numberLbl: UILabel! 
    @IBOutlet var nameLbl: UILabel! 

    var persons = [Person]() 

    struct Person { 
     var number:String 
     var name: String 

     init?(dict: [String:Any]) { 
      guard let number = dict["number"] as? String, let name = dict["name"] as? String else { 
       return nil 
      } 
      self.number = number 
      self.name = name 
     } 
    } 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     getDropdownJSON() 
    } 

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

    func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int { 
     return self.persons.count 
    } 

    func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? { 
     return persons[row].name 
    } 

    func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) { 
     self.numberLbl.text  = self.persons[row].number 
     self.nameLbl.text  = self.persons[row].name 
     self.dropdownPV.isHidden = true 
     self.dropdownTxt.resignFirstResponder() 
    } 

    func textFieldDidBeginEditing(_ textField: UITextField) { 
     if textField == self.dropdownTxt{ 
      self.dropdownPV.isHidden = false 
     } 
    } 

    func getDropdownJSON() { 
     let url = URL(string: "http://localhost/DropdownJSON.json") 
     let task = URLSession.shared.dataTask(with: url!) { (data, response, error) in 
      guard let data = data, error != nil else { 
       print(error?.localizedDescription) 
       return 
      } 
      if let array = (try? JSONSerialization.jsonObject(with: data, options: [])) as? [[String:Any]] { 
       self.persons = array.flatMap(Person.init) 
       DispatchQueue.main.async { 
        self.dropdownPV.reloadAllComponents() 
       } 
      } 
     } 
     task.resume() 
    } 
} 

しかし、私の目標は、関数pickerView(didSelectRow)にnameLblにnumberLblと"名前" にJSON出力"数" を表示することです。

なぜなら、後でnumberLblを投稿したいからです。 nameLblは画面ページに表示するだけです。

可能ですか?誰かがこの問題を助けることができればと感謝します。

UPDATE

enter image description here

感謝。

答えて

1

まずURLSession.dataTaskを使用して、NSData(contentsOf:)の代わりにURLの応答を取得する必要があります。またSwift 3では、NSURLNSDataの代わりにネイティブURLDataを使用してください。

ここでは、number値形式辞書を保存していないという問題があります。この状況を管理する最も簡単な方法は、structを作成し、numbernameの両方の値をそれに格納することです。その後、Arrayの代わりにその構造体の配列をAnyObjectに作成します。

struct Person { 
    var number:String 
    var name: String 

    init?(dict: [String:Any]) { 
     guard let number = dict["number"] as? String, let name = dict["name"] as? String else { 
      return nil 
     } 
     self.number = number 
     self.name = name 
    } 
} 

今のstruct Personの1つの配列を宣言し、あなたのgetDropdownJSON方法では、その中にデータを追加します。

var persons = [Person]() 

func getDropdownJSON() { 
    let url = URL(string: "http://localhost/getDropdownJSON.json") 
    let task = URLSession.shared.dataTask(with: url!) { (data, response, error) in 
     guard let data = data, error == nil else { 
      print(error?.localizedDescription) 
      return 
     } 
     if let array = (try? JSONSerialization.jsonObject(with: data, options: [])) as? [[String:Any]] { 
      self.persons = array.flatMap(Person.init) 
      DispatchQueue.main.async { 
       dropdownPV.reloadAllComponents() 
      } 
     } 
    } 
    task.resume() 
} 

PickerViewDelegateのメソッドでは、この配列を使用してコンポーネントを埋めます。

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

func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int { 
    return self.persons.count 
} 

func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? { 
    return persons[row].name 
} 

は今 didSelectRowに、あなたは単に配列オブジェクトにアクセスする必要があるとあなたは numbername両方の取得となります。

func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) { 
    if row >= self.persons.count { 
     return 
    } 

    self.numberLbl.text = self.persons[row].number 
    self.nameLbl.text = self.persons[row].name 
    self.dropdownPV.isHidden = true 
    self.dropdownTxt.resignFirstResponder() 
} 
関連する問題