#ios #swift
#iOS #swift
Вопрос:
Я создаю приложение погоды, и оно будет использовать контроллер панели вкладок для отображения различных наборов погодных данных. Каждое представление панели вкладок имеет табличное представление, заполненное ячейками с информацией о погоде, поступающей с моего веб-сайта. Первый вид (1/3) работает правильно. Поэтому я скопировал код, изменил соглашения об именовании и попытался создать второе представление. Однако второе представление не заполняется информацией, хотя все остается тем же самым.
Это тот раздел, который работает:
class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {
// getTemperData()
// getWindData()
// getRainData()
@IBOutlet var table: UITableView!
var models = [TemperatureDataModel]()
override func viewDidLoad() {
super.viewDidLoad()
//Register cells
table.register(WeatherTableViewCell.nib(), forCellReuseIdentifier: WeatherTableViewCell.identifier)
table.delegate = self
table.dataSource = self
getTemperData()
}
override func viewDidAppear(_ animated: Bool){
super.viewDidAppear(animated)
}
//Tables
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return models.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: WeatherTableViewCell.identifier, for: indexPath) as! WeatherTableViewCell
cell.configure(with: models[indexPath.row])
return cell
}
func getTemperData(){
//Create the URLs
let temperatureDataUrl = URL(string: "https://weatherstationapi.azurewebsites.net/api/TemperatureSensor/GetData")
guard let requestURLTemp = temperatureDataUrl else {fatalError()}
//Create URL request
var request = URLRequest(url: requestURLTemp)
//Specifiy HTTP Method to use
request.httpMethod = "GET"
request.setValue("application/json", forHTTPHeaderField: "Accept")
request.setValue("Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA1LzA1L2lkZW50aXR5L2NsYWltcy9uYW1lIjoiaWxpci50YWlyaUB0dHUuZWR1IiwiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwNS8wNS9pZGVudGl0eS9jbGFpbXMvbmFtZWlkZW50aWZpZXIiOiI4MjEzYzhhMy1iODgxLTQ4NmUtOGUyMC1mZmNlMDlmNGY0ZjgiLCJuYmYiOiIxNjA1MTE4NDA4IiwiZXhwIjoiMTYzNjY1NDQwOCJ9.HmLCUwnB5Esbao5NDmjflooHcdQK1BWjy1lk6LIKiJg", forHTTPHeaderField: "Authorization")
//Send HTTP Request
let task = URLSession.shared.dataTask(with: request){(data, response, error) in
guard let data = data else {print("did not get data")
return
}
do
{
let decoder = JSONDecoder()
decoder.keyDecodingStrategy = .convertFromSnakeCase
let TemperatureData = try decoder.decode([TemperatureDataModel].self, from: data)
for singleValue in TemperatureData {
print(singleValue.temperature)
self.models.append(singleValue)
DispatchQueue.main.async {
self.table.reloadData()
}
}
} catch {
print("JSONDecoder error:", error)
}
};task.resume()
}
}
Этот раздел в основном такой же, но не работает:
class TempAndHumidityController: UIViewController, UITableViewDelegate, UITableViewDataSource {
@IBOutlet var windtable: UITableView!
var Windmodels = [WindDataModel]()
override func viewDidLoad() {
super.viewDidLoad()
//Register cells
windtable.register(WindTableViewCell.nib(), forCellReuseIdentifier: WindTableViewCell.identifier)
windtable.delegate = self
windtable.dataSource = self
getWindData()
}
override func viewDidAppear(_ animated: Bool){
super.viewDidAppear(animated)
}
//Tables
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return Windmodels.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let windcell = tableView.dequeueReusableCell(withIdentifier: WindTableViewCell.identifier, for: indexPath) as! WindTableViewCell
windcell.configure(with: Windmodels[indexPath.row])
return windcell
}
func getWindData(){
//Create the URLs
let WindDataUrl = URL(string: "https://weatherstationapi.azurewebsites.net/api/WindData/GetAllData")
//Create URL requests
guard let requestURLWind = WindDataUrl else {fatalError()}
var requestWind = URLRequest(url: requestURLWind)
//Request for Wind data
requestWind.httpMethod = "GET"
requestWind.setValue("application/json", forHTTPHeaderField: "Accept")
requestWind.setValue("Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA1LzA1L2lkZW50aXR5L2NsYWltcy9uYW1lIjoiaWxpci50YWlyaUB0dHUuZWR1IiwiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwNS8wNS9pZGVudGl0eS9jbGFpbXMvbmFtZWlkZW50aWZpZXIiOiI4MjEzYzhhMy1iODgxLTQ4NmUtOGUyMC1mZmNlMDlmNGY0ZjgiLCJuYmYiOiIxNjA1MTE4NDA4IiwiZXhwIjoiMTYzNjY1NDQwOCJ9.HmLCUwnB5Esbao5NDmjflooHcdQK1BWjy1lk6LIKiJg", forHTTPHeaderField: "Authorization")
//Send HTTP Request
let task = URLSession.shared.dataTask(with: requestWind){(data, response, error) in
guard let data = data else {return}
do
{
let decoder = JSONDecoder()
// decoder.keyDecodingStrategy = .convertFromSnakeCase
let WindData = try decoder.decode([WindDataModel].self, from: data)
for singleValue in WindData {
print("Wind Speed: (singleValue.windSpeed_MPH)")
print("Wind Direction: (singleValue.windDirection)")
self.Windmodels.append(singleValue)
DispatchQueue.main.async {
self.windtable.reloadData()
}
}
//print("Temperature Data:", TemperatureData)
} catch {
print("JSONDecoder error:", error)
}
};task.resume()
}
}
Все .xibs для ячеек связаны правильно. При использовании точек останова для устранения неполадок второй класс получает HTTP-запрос, но данные не заполняются. Поэтому, когда я ставлю точку останова в ячейке.configure …. (первый класс) Он проходит и заполняет каждую запись .xib. Но во втором классе он даже не доходит до функции configure . Это функция настройки, которая работает
func configure(with model: TemperatureDataModel){
self.TempLabel.text = "(Int(model.temperature))°"
self.HumidityLabel.text = "(Int(model.humidity))%"
self.dayLabel.text = "(String(model.timeCaptured))"
if #available(iOS 13.0, *) {
self.iconImageView.image = UIImage(systemName: "sun.max")
} else {
// Fallback on earlier versions
}
и это функция настройки, которая не достигается
func configure(with model: WindDataModel){
self.KnotsLabel.text = "(Int(model.windSpeed_Knots))"
self.MPHLabel.text = "(Int(model.windSpeed_MPH))"
self.DirectionLabel.text = "(String(model.windDirection))"
if #available(iOS 13.0, *) {
self.iconImageView.image = UIImage(systemName: "wind")
} else {
// Fallback on earlier versions
}
}
Есть идеи?
Комментарии:
1. @matt вы имеете в виду, когда вы щелкаете правой кнопкой мыши на табличном представлении в раскадровке? Если это так, у первого нет никаких подключений к источнику данных или делегату
2. Видите ли вы
numberOfRowsInSection
чтобы увидеть, чтоWindmodels.count
вернется.