#mysql #json #swift #xcode #uitableview
#mysql #json #swift #xcode #uitableview
Вопрос:
……………………………………………………………………………………………………………………………………………….. Я получаю данные и печатаю их. Возможно, код неверен, я просто новичок в swift, но у меня нет никаких ошибок в Xcode. Чего-то не хватает, но я просто не знаю, чего. импортировать UIKit
class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {
struct Class: Codable {
let first_name: String
let last_name: String
let email: String
enum CodingKeys: String, CodingKey {
case first_name = "first_name"
case last_name = "last_name"
case email = "email"
}
}
@IBOutlet weak var tableview: UITableView!
override func viewDidLoad() {
super.viewDidLoad()
let url = URL(string: "https://x.de/x.php")
URLSession.shared.dataTask(with: url!, completionHandler: {(data, response, error) in
guard let data = data, error == nil else { print(error!); return }
let decoder = JSONDecoder()
let classes = try! decoder.decode([Class].self, from: data)
for myClass in classes {
print(myClass.first_name)
print(myClass.last_name)
print(myClass.email)
}
}
).resume()
}
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
tableview.reloadData()
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
//return myarray.count
return 1
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "groupCell", for: indexPath) as UITableViewCell
return cell
}
}
Ответ №1:
Несколько проблем
- В вашем контроллере просмотра отсутствует DataSource, массив, содержащий список пользователей
- Обновите массив (источник данных) после получения удаленных данных
- Перезагрузите
UITableView
после изменения массива (источника данных), используяtableView.reloadData()
- Внутри
numberOfRowsInSection
возвращает количество элементов массиваdataSource.count
UITableView.dequeueReusableCell(withIdentifier:for:)
требуется, чтобы вы зарегистрировали класс ячейки или xib с помощьюtableview.register
метода- Наконец, вместо подчеркивания в качестве first_name используйте соглашение об именовании переменных camelCase в качестве FirstName
struct User: Codable {
let firstName: String
let lastName: String
let email: String
enum CodingKeys: String, CodingKey {
case firstName = "first_name"
case lastName = "last_name"
case email = "email"
}
}
class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {
@IBOutlet weak var tableview: UITableView!
private var dataSource = [User]() {
didSet {
self.tableview.reloadData()
}
}
override func viewDidLoad() {
super.viewDidLoad()
self.tableview.register(UITableViewCell.self, forCellReuseIdentifier: "groupCell")
self.tableview.dataSource = self
self.tableview.delegate = self
let url = URL(string: "https://example.com/users.php")
URLSession.shared.dataTask(with: url!, completionHandler: { [weak self] (data, response, error) in
guard let data = data, error == nil else {
print(error?.localizedDescription ?? "An error occurred")
return
}
// Within `dataTask` we are on background thread, we must update our UITableView on main thread
DispatchQueue.main.async {
self?.dataSource = try! JSONDecoder().decode([User].self, from: data)
}
}).resume()
}
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
tableview.reloadData()
}
func numberOfSections(in tableView: UITableView) -> Int {
return 1
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return dataSource.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "groupCell", for: indexPath)
let user = self.dataSource[indexPath.row]
cell.textLabel?.text = user.firstName
return cell
}
}
Приведенный выше код дает
Комментарии:
1. У меня есть только одна ошибка, которая заключается в следующем: использование неразрешенного идентификатора ‘User’ @AamirR
2. Скопируйте
struct User: Codable { ... }
из моего ответа выше, должно решить проблему3. Ну, спасибо, что сработало, я должен был это увидеть, извините. Когда я запускаю приложение, оно выходит из строя, и я получаю сообщение об ошибке: «Поток 1: Неустранимая ошибка: неожиданно обнаружено нуль при развертывании необязательного значения», где код: переопределить функцию viewDidAppear(_ animated: Bool) { super.viewDidAppear (animated) tableview.reloadData() } @AamirR
4. Привет, спасибо за ваш ответ и помощь, теперь это работает :). Я отредактировал свой URL в вашем ответе, чтобы никто не смог его увидеть. Только один вопрос, я пытался показать имя, фамилию и адрес электронной почты, но не смог, вы можете мне помочь, пожалуйста?
Ответ №2:
В функции cellForRowAt вы должны сделать что-то подобное :
cell.textLabel?.text = myarray[indexPath.row]
потому что текст myarray должен отображаться на ярлыке или что-то еще
Комментарии:
1. «myarray» что я должен написать там из своего кода? @Деннис Фелдбуш