Swift4.2 parse json для использования в pickerview - PullRequest
0 голосов
/ 16 сентября 2018

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

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

Я искал и пытался адаптировать различные примеры как на этом форуме, так и на других, но по какой-то причине я просто не могу заставить его работать, я новичок в Swift, поэтому я нахожусь на кривой обучения!

Самое близкое, что у меня есть - account(data: ["account1", "account2", "account3"]), но мне нужно получить ["account1", "account2", "account3"]

Я надеюсь, что кто-то может помочь и, надеюсь, не понизить этот вопрос.

import UIKit

let json = """
{
"returnResult":1,
"data":["account1", "account2", "account3"]
}
"""

struct account: Codable {
    var data: [String]
}

let accounts: account = try JSONDecoder().decode(account.self, from:json.data(using: .utf8)!)

print(accounts)

/*
RESULT RETURNED
account(data: ["account1", "account2", "account3"])

RESULT REQUIRED
["account1", "account2", "account3"]

PICKERVIEW CODE FROM WORKING VIEW

// picker view methods
func numberOfComponents(in pickerView: UIPickerView) -> Int {
return 1
}
func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent    component: Int) -> Int {
return accs.count
}
func pickerView(_ pickerView: UIPickerView, titleForRow row: Int,    forComponent component: Int) -> account? {
return accs[row]
}

// delegate method
func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
let selectedDriver = accs[row]
displayLbl.text = selectedDriver
}
*/

1 Ответ

0 голосов
/ 20 сентября 2018

Я, наконец, отсортировал его, используя следующий код в качестве основы для решения

import UIKit

struct Account: Codable {
    var data: [String]
}

class ViewController: UIViewController {
    // MARK: - IBOutlets
    @IBOutlet private var displayLabel: UILabel!
    @IBOutlet private var pickerView: UIPickerView!

    // MARK: - Internal Variables'
    var account: Account?

    // MARK: - IBActions
    @IBAction private func showPicker(_ sender: UIButton) {
        sender.isSelected = !sender.isSelected
        pickerView.isHidden = !sender.isSelected
    }

    private func createAccountList() {
        let json = """
        {
        "returnResult":1,
        "data":["account1", "account2", "account3","account4", "account5", "account6"]
        }
        """
        do {
            account = try JSONDecoder().decode(Account.self, from: json.data(using: .utf8)!)
        } catch {
            print(error.localizedDescription)
        }
    }

    private func initUI() {
        pickerView.delegate = self
        pickerView.dataSource = self
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        createAccountList()
        initUI()
        pickerView.reloadAllComponents()
        // Do any additional setup after loading the view, typically from a nib.
    }
}

extension ViewController: UIPickerViewDataSource, UIPickerViewDelegate {
    func numberOfComponents(in pickerView: UIPickerView) -> Int {
        return 1
    }

    func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
        return account?.data.count ?? 0
    }

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

    func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
        displayLabel.text = account?.data[row]
    }
}

Проект можно найти на Github https://github.com/techmehra/uipicker-demo

Мне пришлось изменить коднемного, чтобы заставить его работать с живым ответом API.

...