UILabel возвращается к тексту по умолчанию при вращении iPhone - PullRequest
0 голосов
/ 21 сентября 2018

Это немного странно, но я не уверен, с чего начать отладку.У меня есть UILabel в стандартном представлении, в котором я обновляю текст на основе определенных условий.В IB я установил текст по умолчанию, который читает «Загрузка ...», а затем метод viewDidAppear обновляет текст в зависимости от условий.Это работает нормально, однако, если я затем поворачиваю свой iPhone (или симулятор), он возвращает UILabel обратно к стандартному тексту «Загрузка ...».

Интересно то, что когда я смотрю его на iPadИ симулятор, и реальное устройство не изменяют текст обратно на значение по умолчанию и действуют так, как я ожидал.

Я пытался обнаружить изменение ориентации и сбросить текст, но это не имеет никакого эффекта, это немногонапример, ярлык заблокирован в состоянии по умолчанию.

Рад предоставить код, если это необходимо, но я действительно не уверен, какой код важен, так как это прямая метка и обновление ее текста.

Спасибо

Portrait View

Landscape View

import UIKit

class PredictionViewController: UIViewController {

    var predictionData: Predictions!
    var embeddedVC: PredictionsTableViewController?

    @IBOutlet weak var messageTextBox: UILabel!
    @IBOutlet weak var predictionSubmitButton: UIButton!
    @IBOutlet weak var predictionSubmitButtonHeight: NSLayoutConstraint!

    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.

        //self.messageTextBox.isEditable = false
        NotificationCenter.default.addObserver(self, selector: #selector(settingChanged(notification:)), name: UserDefaults.didChangeNotification, object: nil)
    }

    override func viewDidAppear(_ animated: Bool) {
        let preferences = UserDefaults.standard
        if (preferences.object(forKey: "regID") == nil)
        {
            loadLoginScreen()
        }
        else {
            let sv = UIViewController.displaySpinner(onView: self.view)
            let predictionStatus = preferences.object(forKey: "predictionStatus") as! String

            switch (predictionStatus) {
                case "inplay":
                    setInplay(view: self)
                case "finished":
                    setFinished(view: self)
                case "predict":
                    setPredict(view: self)
                default:
                    self.messageTextBox.text = "Error!"
            }
            if (self.messageTextBox.isHidden) {
                self.messageTextBox.isHidden = false
            }
            UIViewController.removeSpinner(spinner: sv)
        }
    }

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if (segue.identifier == "predictionSegue") {
            if let vc = segue.destination as? PredictionsTableViewController {
                // get a reference to the embedded VC
                self.embeddedVC = vc
            }
        }
    }

    @objc func settingChanged(notification: NSNotification) {
        let preferences = UserDefaults.standard
        let predictionStatus = preferences.object(forKey: "predictionStatus") as! String

        switch (predictionStatus) {
            case "inplay":
                setInplay(view: self)
            case "finished":
                setFinished(view: self)
            case "predict":
                setPredict(view: self)
            default:
                messageTextBox.text = "Error!"
        }
    }

    func setInplay(view: PredictionViewController) {
        view.messageTextBox.text = "In Play!"
        view.predictionSubmitButtonHeight.constant = 0
    }

    func setFinished(view: PredictionViewController) {
        view.messageTextBox.text = "Finished!"
        view.predictionSubmitButtonHeight.constant = 0
    }

    func setPredict(view: PredictionViewController) {
        view.messageTextBox.text = "Predict Now!"
        view.predictionSubmitButton.isEnabled = true
        view.predictionSubmitButton.setTitle("Submit", for: .normal)
        view.predictionSubmitButtonHeight.constant = 58
    }

    @IBAction func predictionSubmitButtonAction(_ sender: UIButton) {
        let preferences = UserDefaults.standard
        let sv = UIViewController.displaySpinner(onView: self.view)
        CheckTime(finished: { isSuccess in

            switch (isSuccess) {
            case "inplay":
                preferences.set("inplay", forKey: "predictionStatus")
                //too late alert
            case "finished":
                preferences.set("finished", forKey: "predictionStatus")
                //too late alert
            case "predict":
                preferences.set("predict", forKey: "predictionStatus")

                if let predictionData = self.embeddedVC?.getPredictionData() {
                    //send back to website
                    let regID = preferences.object(forKey: "regID")
                    let url = URL(string: "[URL]")
                    let session = URLSession.shared

                    let request = NSMutableURLRequest(url: url!)
                    request.httpMethod = "POST"
                    let bodyData = "{}"

                    request.httpBody = bodyData.data(using: String.Encoding.utf8);
                    let task = session.dataTask(with: request as URLRequest, completionHandler: {
                        (data, response, error) in

                        guard let data = data, let _ = response, error == nil else
                        {
                            DispatchQueue.main.async(
                                execute: {
                                    UIViewController.removeSpinner(spinner: sv)
                                    self.displayAlertMessage(message: "response error: \(String(describing: error?.localizedDescription))", type: "error")
                            }
                            )
                            return
                        }

                        do {

                            let decoder = JSONDecoder()
                            let predictionResult = try decoder.decode(ReturnData.self, from: data)

                            DispatchQueue.main.async(
                                execute: {
                                    if (predictionResult.success) {
                                        self.displayAlertMessage(message: predictionResult.message, type: "message", title: "Predictions Received")
                                    }
                                    else {
                                        self.displayAlertMessage(message: "response error: \(String(describing: error?.localizedDescription))", type: "error")
                                    }
                                    UIViewController.removeSpinner(spinner: sv)
                                }
                            )
                        } catch {
                            DispatchQueue.main.async(
                                execute: {
                                    UIViewController.removeSpinner(spinner: sv)
                                    self.displayAlertMessage(message: "response error: \(error)", type: "error")
                            }
                            )
                            return
                        }
                    })

                    task.resume()
                }
            default:
                UIViewController.removeSpinner(spinner: sv)
                self.messageTextBox.text = "Error!"
                preferences.set("error", forKey: "predictionStatus")
            }
            preferences.synchronize()

            if (self.messageTextBox.isHidden) {
                self.messageTextBox.isHidden = false
            }

        })
    }

}

override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
        super.viewWillTransition(to: size, with: coordinator)
        if UIDevice.current.orientation.isLandscape {
            print("Landscape")
            //imageView.image = UIImage(named: const2)
        } else {
            print("Portrait")
            //imageView.image = UIImage(named: const)
        }
        self.messageTextBox.text = "Error!"
}

Ответы [ 2 ]

0 голосов
/ 21 сентября 2018

Я считаю, что вы должны снять свой код viewDidAppear и вставить внутрь viewDidLoad.

Если вы не хотите использовать код в другой ориентации, снимите флажок для всех других ориентаций и выберите только ту, которую хотите реализовать, что решит вашу проблему, однако, если вы хотите работатьв других ориентациях попробуйте сделать то, что я сказал, и посмотрите, работает ли оно.

Даже ничего из того, что я только что сказал, не работает, попробуйте просмотреть ваш код, если у вас есть условие для изменения текста, когда происходит переход.

Еще одна вещь, всего лишь совет, не кладите слишком много кода в простое действие, попробуйте рефакторинг в других методах, а затем вызовите его внутри своего действия.

0 голосов
/ 21 сентября 2018

Можно ли использовать этот метод делегата для ориентации экрана.

override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
    coordinator.animate(alongsideTransition: { (UIViewControllerTransitionCoordinatorContext) -> Void in

    }, completion: { (UIViewControllerTransitionCoordinatorContext) -> Void in
        //refresh view once rotation is completed not in will transition as it returns incorrect frame size.Refresh here
        **//---> Set the text for label here.**

    })
    super.viewWillTransition(to: size, with: coordinator)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...