Почему один и тот же код не будет работать на нескольких экземплярах контроллера панели вкладок?

#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. Видите ли вы print букву s из расшифрованных данных о ветре? Кроме того, попробуйте ввести точку останова, numberOfRowsInSection чтобы увидеть, что Windmodels.count вернется.