Как заполнить табличное представление на основе локального файла json? - PullRequest
0 голосов
/ 31 января 2019

Я создаю простую игру и хочу создать экран выбора уровня.Для сохранения всех уровней я создал файл JSON.Сейчас я пытаюсь заполнить табличное представление уровнями из файла JSON.

[
    {
        "name": "animals",
        "levels": [
            {"start": "cat", "end": "bat"},
            {"start": "dog", "end": "pig"}
        ]
    },
    {
        "name": "foods",
        "levels": [
            {"start": "grape", "end": "apple"}
        ]
    }
]

Мне удалось успешно заполнить таблицу на основе массива, как показано ниже, но не могу понять, какчтобы сделать это из файла JSON.

import UIKit

var test = ["hello", "world"]

class PackTableViewController: UITableViewController {

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

    override func numberOfSections(in tableView: UITableView) -> Int {
        // #warning Incomplete implementation, return the number of sections
        return 1
    }

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return test.count
    }

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)

        cell.textLabel?.text = test[indexPath.row]

        return cell
    }
}

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

animal
food

Спасибо!

Ответы [ 2 ]

0 голосов
/ 04 февраля 2019

вы хотите заполнить табличное представление локальным файлом json, так что вот простой и легкий ответ, который вы просто должны проверить,

http://vasundharavision.com/blog/ios/how-to-parse-json-from-File-and-url-in-swift-4-2

я надеюсь, что это работает длявы.

0 голосов
/ 31 января 2019

Довольно просто:

Создать две структуры вне класса

struct Item: Decodable {
    let name: String
    let levels : [Level]
}

struct Level: Decodable {
    let start, end: String
}

и массив источника данных внутри класса

var items = [Item]()

В viewDidLoad декодируйте JSON, предполагая, что файл в пакете имеет имя items.json

override func viewDidLoad() {
    super.viewDidLoad()
    do {
        let data = try Data(contentsOf: Bundle.main.url(forResource: "items", withExtension: "json")!)
        items = try JSONDecoder().decode([Item].self, from: data)
        tableView.reloadData()
    } catch { print(error) }
}

Вы можете удалить numberOfSections, поскольку по умолчанию установлено значение 1, другие методы -

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return items.count
}

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)

    cell.textLabel?.text = items[indexPath.row].name
    // do something with items[indexPath.row].levels
    return cell
}
...