【问题标题】:Wait for an addSubview to be successful before adding another Subview等待 addSubview 成功后再添加另一个 Subview
【发布时间】:2019-09-30 22:36:42
【问题描述】:

我正在尝试使用自动布局将多个子视图添加到我的 ViewController。因此,很多这些视图都依赖于锚点或其他。

我的课在下面

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 出现但没有别的。即使您可以看到它是为了添加子视图。

如果我返回导航然后再次返回所有视图都是正确的!

我在 addSubview(dateTitleView) 行上放置了一个块点,代码在我看到 resFrame 图像出现之前到达该行。

所以,我怀疑这些视图没有出现,因为它们试图锚定尚不存在的东西。

我曾期望函数按顺序处理。我的意思是 showTime() 在 showResFrame() 完成之前不会被调用。这不是正在发生的事情吗?

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

【问题讨论】:

    标签: ios swift addsubview


    【解决方案1】:

    您需要在 viewDidLoad / viewWillAppear 而不是 viewDidAppear 中更早地添加它们

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

    viewDidAppear 在 vc 的视图出现时被调用,所以你会注意到这个添加

    【讨论】:

    • 我原来是这样的,注意 viewDidLoad 只被调用了一次。当视图非常第一次出现时。我应该澄清这个 ViewController 是 TabViewController 的一部分。因此,当我第一次进入此选项卡时,会调用 viewDidLoad。然后我导航到另一个选项卡,然后再回到这个选项卡,我没有看到再次调用 VDL。我在那里有打印代码来验证它何时被调用。
    • 你必须刷新所有这些视图的添加吗?为什么? , 如果是这样试试viewWillAppear
    • 我试试看
    • 就是@Sh_Khan。从 DidAppear 更改为 WillAppear 解决了我的问题。谢谢楼主
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-09
    • 2022-10-04
    • 1970-01-01
    相关资源
    最近更新 更多