Как получить данные JSON в UIPickerView в Swift 3.0?

Мой вопрос Как получить данные из PHP в UIPickerView в Swift 3.0?

В настоящее время у меня есть эти коды для UIPickerView для создания выпадающего списка. Прямо сейчас я могу только отобразить значение выпадающего списка на основе объявления переменной внутри xcode var department = ["ICTD","FAD","PSD"]

dropdown.swift

import UIKit
class ViewController: UIViewController, UIPickerViewDelegate, UIPickerViewDataSource, UITextFieldDelegate {
@IBOutlet var departmentLbl: UITextField!
@IBOutlet var dropdownLbl: UIPickerView!
@IBOutlet var outputLbl: UILabel!

@IBOutlet var user_idLbl: UILabel!

var department = ["ICTD","FAD","PSD"]

var user_id: String!

override func viewDidLoad() {
super.viewDidLoad()

user_id = "ID001" // these value that need to be past to PHP

let url = URL(string: "http://localhost/getdepartment.php")
let session = URLSession.shared
let request = NSMutableURLRequest(url: url! as URL)
request.httpMethod = "POST"let LoginDataToPost = "user_id=\(user_id!)"request.httpBody = LoginDataToPost.data(using: String.Encoding.utf8)
let task = session.dataTask(with: request as URLRequest, completionHandler: {
(data, response, error) in
if error != nil { return }
else {
do {
if let json = try JSONSerialization.jsonObject(with: data!) as? [String: String] {
DispatchQueue.main.async {
let display     = Int(json["display"]!)
let realname    = json["real_name"]
let department  = json["dept"]

if(display == 1) {
// dropdown list value display here
return
}
else { return }
}
}
else { }
}
catch {}
}
})
task.resume()
}

func numberOfComponents(in pickerView: UIPickerView) -> Int {
return 1
}
func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {

var countrows : Int = department.count
if pickerView == dropdownLbl {
countrows = self.department.count
}
return countrows
}
func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {

if pickerView == dropdownLbl {
let titleRow = department[row]
return titleRow
}
return ""}
func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {

if pickerView == dropdownLbl {
self.departmentLbl.text = self.department[row]
self.dropdownLbl.isHidden = true
}
}

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

}

И у меня есть этот код PHP, который дает вывод

настоящее имя а также отдел

основанный на Идентификатор пользователя значение из кода x

getdepartment.php

<?php
$connect = mysqli_connect("","","","");
global $connect;

if (isset($_POST['user_id'])) {

$user_id = $_POST['user_id'];

$sql = "SELECT * FROM table WHERE user_id ='$user_id'";
$result = mysqli_query($connect,$sql);
if($result && mysqli_num_rows($result)>0){
while ($row = mysqli_fetch_array($result)) {

$real_namedb = $row['real_name'];
$dept_db     = $row['dept'];

$output = array('real_name' => $real_namedb, 'dept' => $dept_db);
echo json_encode($output);
}
mysqli_free_result($result);
}
else { }
}
?>

Этот PHP дает вывод данных JSON, как показано ниже:

 {"display":"1","real_name":"NAME TEST 1","dept":"ICTD"}
{"display":"1","real_name":"NAME TEST 2","dept":"ICTD"}

Ценю, если кто-то может помочь.

Благодарю.

1

Решение

Я считаю, что вы должны создать выпадающий список на основе значений, которые вы получили от сервера. Основываясь на коде, который вы дали в этом вопросе, я заметил, что вы не добавляете названия отделов, полученные с сервера, в свой массив.

Вы можете внести следующие изменения и наблюдать:

if let json = try JSONSerialization.jsonObject(with: data!) as? [String: String]
{
DispatchQueue.main.async
{
let display = Int(json["display"]!)
let realname = json["real_name"]
let departmentName = json["dept"]

if(display == 1) {
// dropdown list value display here
self.department.append(departmentName)
self.dropdownLbl.reloadAllComponents() // this is reference to your pickerView. Make it global and use it
return
}else { return }
}
}

Пожалуйста, дайте мне знать, если это решит проблему или нет …

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]