Я новичок в Swift, и я в отчаянии, поэтому, пожалуйста, будьте добры ко мне.
Я создаю приложение, которое загружает данные с URL-адреса, публикуя определенный идентификатор и возвращая массив JSON. JSON выглядит так:
[{"group":"500","from":"2019-01-01","to":"2019-01-05"},{...}]
Он имеет номер группы как «группа», дату начала «от» и дату окончания «до».
Я хочу, чтобы разные группы отображались в табличном представлении с датами От и К-Dates. Мне удалось правильно загрузить данные, но мне не удалось показать их в виде таблицы.
Мой код внизу. Может быть, кто-то из вас сможет узнать, что я сделал не так.
Когда я запускаю проект, я получаю пустую таблицу.
import UIKit
typealias Fahrten = [FahrtenElement]
struct FahrtenElement: Codable {
let group: String?
let from: String?
let to: String?
enum CodingKeys: String, CodingKey {
case group = "group"
case from = "from"
case to = "to"
}
}
class BookingsController: UITableViewController {
var tableview: UITableView!
var groups = [Fahrten]()
// MARK: - Table view data source
override func viewDidLoad() {
super.viewDidLoad()
downloadData()
}
override func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
let label = UILabel()
label.text = "Groups"
label.backgroundColor = .yellow
return label
}
// Section
override func numberOfSections(in tableView: UITableView) -> Int {
return 1
}
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return self.groups.count
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
//lblname to set the title from response
cell.textLabel?.text = "Group \(String(describing: groups[indexPath.row].group))"
cell.detailTextLabel?.text = "From \(String(describing: groups[indexPath.row].from)) to \(String(describing: groups[indexPath.row].to))"
return cell
}
func downloadData() {
let id = "..."
let url = URL(string: "...")!
// request url
var request = URLRequest(url: url)
// method to pass data POST - cause it is secured
request.httpMethod = "POST"
// body gonna be appended to url
let body = "id=(\(id))"
// append body to our request that gonna be sent
request.httpBody = body.data(using: .utf8)
URLSession.shared.dataTask(with: request) { (data, response, err) in
guard let data = data else { return }
do {
let groups = try JSONDecoder().decode(Fahrten.self, from: data)
print(groups)
self.tableview.reloadData() // I get an crash here: Thread 1: Fatal error: Unexpectedly found nil while unwrapping an Optional value }
} catch let jsonErr {
print("Error serializing json:", jsonErr)
}
}.resume()
}
зачем ты это прокомментировал?? // self.tableview.reloadData()
Я получаю сбой в "self.tableview.reloadData()". "Тема 1: Неустранимая ошибка: Неожиданно найдено nil при распаковке необязательного значения"
Ваш tableView равен нулю? может быть? вы вызываете только downloadData в viewDidLoad? как вы инициализируете контроллер представления?
Попробуйте добавить точку останова в эту строку и войдите в код. проверьте значения в инспекторе, чтобы проверить на ноль





Из того, что я вижу, похоже, что вы очищаете массив и не перезагружаете данные.
Вы должны назначить полученное свойство групп self.groups, а затем перезагрузить данные.
DispatchQueue.main.async {
self.groups = groups // change here
self.tableview.reloadData()
}
Когда я перезагружаю данные, я получаю «Поток 1: Неустранимая ошибка: неожиданно найдено nil при развертывании необязательного значения» :(
@SörenYannickSeitz Я думаю, вы поняли это в своей функции tableView:cellForRowAt:, попробуйте отладить ее или добавить несколько операторов печати.
Возможно, .group, .from или .to в одном из элементов равно нулю, но с String! вы говорите Swift, что они никогда не будут равны нулю. Попробуйте изменить их на String?.
По-прежнему возникает та же ошибка: «Поток 3: Неустранимая ошибка: неожиданно найдено nil при развертывании необязательного значения». Я проверил их с помощью оператора печати, и ни одно из значений не равно нулю.
что-то определенно нулевое. выполняйте код, пока не наткнетесь на строку, вызывающую исключение. затем запустите снова, остановитесь на этой строке и проверьте все используемые значения
Попробуйте этот код.
Ваша модель.
typealias Fahrten = [FahrtenElement]
struct FahrtenElement: Codable {
let group: String
let from: String
let to: String
enum CodingKeys: String, CodingKey {
case group = "group"
case from = "from"
case to = "to"
}
}
Используйте его, я использую его с локальным json с той же структурой.
func getFehData(){
let url = Bundle.main.url(forResource: "fah", withExtension: "json")!
do {
let jsonData = try Data(contentsOf: url)
let fahrten = try? JSONDecoder().decode(Fahrten.self, from: jsonData)
print(fahrten)
}
catch {
print(error)
}
}
Выход : (фиктивные данные)
Это дает мне ошибку: «Недопустимое преобразование из бросающей функции типа '() throws -> ()' в негенерирующую функцию типа '@convention (block) () -> Void'"
@SörenYannickSeitz Проверить Изменить ответ.
Пожалуйста, добавьте описание того, что вы сделали и как это решает проблему. Это сделано для того, чтобы помочь будущим читателям, которые ищут решение, подобное тому, которое есть у OP.
@dahiya_boy Я получаю сообщение об ошибке, когда перезагружаю данные. «Тема 8: Неустранимая ошибка: неожиданно найдено nil при развертывании необязательного значения»
@SörenYannickSeitz В какой строке вы получили ошибку? Что на самом деле вы делаете, делаете из моего ответа или другого ответа?
@dahiya_boy Я обновил его выше. Я не могу найти, где значение равно нулю.
@SörenYannickSeitz Пожалуйста, дайте пример проекта с этой проблемой. Я разберусь с проблемой, иначе мне не удастся решить эту проблему.
добавьте
tableview.dataSource=trueи раскомментируйте эту строку:self.tableview.reloadData()послеself.groups = [Fahrten]()