#swift #uitableview #uiviewcontroller #alamofire #swifty-json
Вопрос:
У меня есть Tableviewcontroller, встроенный в Viewcontroller. И я хотел бы заполнить эти 3 ячейки данными из моего запроса alamofire post. какой самый простой способ это сделать? я вижу, что мой запрос на публикацию alamofire напечатан в области отладки. так далеко я зашел до сих пор.
контроллер просмотра выглядит следующим образом.
import UIKit import Alamofire import SwiftyJSON class ViewController: UIViewController { @IBOutlet weak var tableViewScore: UITableView! override func viewDidLoad() { super.viewDidLoad() getScores() tableViewScore.delegate = self tableViewScore.dataSource = self } } public func getScores() { let URL_SCORES = "http://localhost/projecttitle/v1/scores.php" let username = "username@projecttitle.com" //creating parameters for the post request for now. let parameters: Parameters=[ "username":username ] //Sending http post request AF.request(URL_SCORES, method: .post, parameters: parameters).responseJSON { response in //printing response print(response) switch response.result { case .success (let value): let json = JSON(value) for (key,subJson):(String, JSON) in json["scores"] { debugPrint (key) //key debugPrint (subJson) //value debugPrint (subJson["date"]) //value debugPrint (subJson["coursename"]) //value debugPrint (subJson["score"]) //value } case .failure(let error): print(error) } } } extension ViewController : UITableViewDataSource{ public func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -gt; Int { return count } public func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -gt; UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! TableViewCellScores // populate the cells with date, coursename and score return cell } } extension UIViewController : UITableViewDelegate{ public func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -gt; CGFloat { return 50 } }
ячейка UITableViewCell выглядит так.
import UIKit class TableViewCellScores: UITableViewCell { @IBOutlet weak var dateLabel: UILabel! @IBOutlet weak var courseNameLabel: UILabel! @IBOutlet weak var scoreLabel: UILabel! override func awakeFromNib() { super.awakeFromNib() // Initialization code } override func setSelected(_ selected: Bool, animated: Bool) { super.setSelected(selected, animated: animated) // Configure the view for the selected state } }
Ответ №1:
Вы можете создать модель с именем «MyModel» за пределами контроллера представления :
struct MyModel { let date: String? let coursename: String? let score: String? }
И в вашем контроллере представления определите переменную:
var myModel = [MyModel]()
На вашей getScores()
функции fill your model
:
for (key,subJson):(String, JSON) in json["scores"] { debugPrint (key) //key debugPrint (subJson) //value debugPrint (subJson["date"]) //value debugPrint (subJson["coursename"]) //value debugPrint (subJson["score"]) //value self.myModel.append(date: subJson["date"], coursename: subJson["coursename"], score: subJson["score"]) } tableViewScore.reloadData() //reload your tableview end of the for loop
Вернитесь self.myModel.count
на свое место numberOfRowsInSection
Около cellForRowAt
:
cell.dateLabel.text = self.myModel[indexPath.row].date
Комментарии:
1. в строке
self.myModel.append...
я получил следующую ошибку «Не удается найти» себя «в области видимости», а в строке с tableViewScore.reloadData() я получил ошибку «Не удается найти «tableViewScore» в области видимости»2. Напишите свое имя для просмотра таблиц в tableViewScore.reloadData(), также удалите self из self.MyModel.append
3. затем я получаю ошибку «Не удается найти» MyModel «в области видимости», а tableViewScore-это имя моего tableview
4. где определена моя модель?
5. я создал новый файл под названием MyModel.
import foundation struct MyModel { let teedate: String? let coursename: String? let golfclubname: String? }