Подождите, пока addSubview будет успешным, прежде чем добавлять другой Subview - PullRequest
0 голосов
/ 14 мая 2019

Я пытаюсь добавить несколько подпредставлений в мой ViewController, используя autolayout. Итак, многие из этих представлений зависят от якорей или другого.

Мой класс ниже

class historyView: UIViewController {

    var resFrame : UIImageView = {
        let image = UIImage(named: "historyFrame.png")
        let imageView = UIImageView(image: image)
        imageView.translatesAutoresizingMaskIntoConstraints = false
        return imageView
    }()

   var timeTitleView : UITextView = {
        let textView = UITextView()
        let titleTxt = NSLocalizedString("Time", comment: "")
        textView.text = titleTxt
        textView.font = UIFont(name: "BPG Nino Mtavruli", size: 20)
        textView.adjustsFontForContentSizeCategory = true
        textView.translatesAutoresizingMaskIntoConstraints = false
        return textView
    }()

    var timeResView : UITextView = {
        let textView = UITextView()
        textView.font = UIFont(name: "BPG Nino Mtavruli", size: 20)
        textView.adjustsFontForContentSizeCategory = true
        textView.translatesAutoresizingMaskIntoConstraints = false
        return textView
    }()

    var dateTitleView : UITextView = {
        let textView = UITextView()
        let titleTxt = NSLocalizedString("Date", comment: "")
        textView.text = titleTxt
        textView.font = UIFont(name: "BPG Nino Mtavruli", size: 20)
        textView.adjustsFontForContentSizeCategory = true
        textView.translatesAutoresizingMaskIntoConstraints = false
        return textView
    }()

    var dateResView : UITextView = {
        let textView = UITextView()
        let comResClass = complileResults()
        let resTxt = comResClass.getResult(key: "date")
        textView.text = resTxt
        textView.font = UIFont(name: "BPG Nino Mtavruli", size: 20)
        textView.adjustsFontForContentSizeCategory = true
        textView.translatesAutoresizingMaskIntoConstraints = false
        return textView
    }()

override func viewDidAppear(_ animated: Bool) {
        showResults()
}

 func showResults() {
    showResFrame() 
    showTime()
    showDate()
}

func showResFrame() {
        view.addSubview(resFrame)
        resFrame.centerXAnchor.constraint(equalTo: self.view.centerXAnchor).isActive = true
        resFrame.centerYAnchor.constraint(equalTo: self.view.centerYAnchor).isActive = true
        resFrame.widthAnchor.constraint(equalToConstant: 350).isActive = true
        resFrame.heightAnchor.constraint(equalToConstant: 500).isActive = true
        showTime()
    }

    func showTime() {
        showTimeTitle()
        showTimeResult()
    }

    func showTimeTitle() {
        let titleTxt = NSLocalizedString("Time", comment: "")
        timeTitleView.text = titleTxt
        timeTitleView.font = UIFont(name: "BPG Nino Mtavruli", size: 20)
        timeTitleView.translatesAutoresizingMaskIntoConstraints = false
        view.addSubview(timeTitleView)
        timeTitleView.topAnchor.constraint(equalTo: resFrame.topAnchor, constant: 15).isActive = true
        timeTitleView.leftAnchor.constraint(equalTo: resFrame.leftAnchor, constant: 175).isActive = true
        timeTitleView.widthAnchor.constraint(equalToConstant: 80).isActive = true
        timeTitleView.heightAnchor.constraint(equalToConstant: 30).isActive = true

    }

    func showTimeResult() {
        let comResClass = complileResults()
        let resTxt = comResClass.getResult(key: "time")
        timeResView.text = resTxt
        view.addSubview(timeResView)
        timeResView.topAnchor.constraint(equalTo: resFrame.topAnchor, constant: 15).isActive = true
        timeResView.leftAnchor.constraint(equalTo: resFrame.leftAnchor, constant: 255).isActive = true
        timeResView.widthAnchor.constraint(equalToConstant: 80).isActive = true
        timeResView.heightAnchor.constraint(equalToConstant: 30).isActive = true
    }

    func showDate() {
        showDateTitle()
        showDateResult()
    }

    func showDateTitle() {
        view.addSubview(dateTitleView)
        dateTitleView.topAnchor.constraint(equalTo: resFrame.topAnchor, constant: 15).isActive = true
        dateTitleView.leftAnchor.constraint(equalTo: resFrame.leftAnchor, constant: 15).isActive = true
        dateTitleView.widthAnchor.constraint(equalToConstant: 80).isActive = true
        dateTitleView.heightAnchor.constraint(equalToConstant: 30).isActive = true
    }

    func showDateResult() {
        let comResClass = complileResults()
        let resTxt = comResClass.getResult(key: "date")
        dateResView.text = resTxt
        view.addSubview(dateResView)
        dateResView.topAnchor.constraint(equalTo: resFrame.topAnchor, constant: 15).isActive = true
        dateResView.leftAnchor.constraint(equalTo: resFrame.leftAnchor, constant: 95).isActive = true
        dateResView.widthAnchor.constraint(equalToConstant: 80).isActive = true
        dateResView.heightAnchor.constraint(equalToConstant: 30).isActive = true
    }

}

Когда представление появляется в первый раз, resFrame UI Появляется ImageView, но больше ничего. Несмотря на то, что вы можете видеть, что это означает, что он добавляет дополнительные представления.

Если я вернусь в Navigation, а затем вернусь снова, все представления верны!

Я поместил блок-точку в строку addSubview (dateTitleView) и код попал в эту строку ДО того, как увидел изображение resFrame.

Итак, я подозреваю, что представления не появляются, поскольку они пытаются привязать что-то, что еще не существует.

Я ожидал, что функции будут обрабатываться по порядку. Я имею в виду, что showTime () не будет вызываться до тех пор, пока не будет сделано showResFrame (). Разве это не то, что происходит?

func showResults() {
        showResFrame() 
        showTime()
        showDate()
    }

1 Ответ

0 голосов
/ 14 мая 2019

Вы должны добавить их раньше внутри viewDidLoad / viewWillAppear, а не viewDidAppear

override func viewWillAppear() {
    super.viewWillAppear()
    showResults()
}

viewDidAppear вызывается, когда появляется вид виртуального канала, поэтому вы заметите, что добавление

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