Swift 3 - UIView并不总是显示其内容

时间:2016-12-21 17:39:40

标签: ios swift uiview

我有一个UIViewController(主菜单),在我的其他UIViewController(加载屏幕)完成从网上下载/同步数据后显示。我的主菜单出现问题,因为它不会始终显示视图上显示的所有UIButton!有一个不一致,主菜单加载每10次中有1次,所有UIButton都会出现。

以下是视图的外观:Correct View

以下是视图通常显示的方式:How it shows up

我可以将手指放在UIButton所在的位置,然后将手指移开,它们会出现。我也可以点击他们应该的位置,我的segue仍将触发,但UIButtons不会自动显示。它看起来像This

我尝试将一个MainMenuView.setNeedsDisplay()添加到ViewDidLoad函数中,但它没有帮助。我还在视图上创建了一个测试UIButton,它触发MainMenuView.setNeedsDisplay()命令,但隐藏的UIButton仍然是隐藏的。

如果我让屏幕闲置30秒左右,所有UIButton都会随机显示,而我不必手动显示它们。

主菜单视图是正常的,如果我从加载屏幕旁边的应用程序的任何部分转移到它,所有UIButton都可见。

编辑:主菜单代码 - (引用很强)

import UIKit
import CoreData

class MainMenuViewController: UIViewController {

    // MARK: References
    @IBOutlet var btnGasManifolds: UIButton!
    @IBOutlet var btnAirCompressors: UIButton!
    @IBOutlet var btnVacuumPumps: UIButton!
    @IBOutlet var btnUnitConversion: UIButton!
    @IBOutlet var btnCFMCalculator: UIButton!
    @IBOutlet var mainMenuView: UIView!

    var userData = [NSManagedObject]()

    // MARK: Functions

    override func viewDidLoad() {
        var name = String()
        for duserData in userData {
            name = duserData.value(forKey: "nameFull") as! String
        }
        print("Main Menu\n->\(name)")
        backgroundSetup()
    }

    override func viewDidAppear(_ animated: Bool) {
        mainMenuView.setNeedsDisplay()
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    @IBAction func btnTest(_ sender: Any) {
        mainMenuView.setNeedsDisplay()
    }

    override func prepare(for segue: UIStoryboardSegue, sender: Any!) {
        if segue.identifier == "settingsSegue" {
            let destination = segue.destination as! SettingsViewController
            destination.userData = userData
        }
    }

    // Background Setup
    func backgroundSetup() {
        let background = UIImage(named: "Data Screens")

        var imageView : UIImageView!
        imageView = UIImageView(frame: view.bounds)
        imageView.contentMode =  UIViewContentMode.scaleAspectFill
        imageView.clipsToBounds = true
        imageView.image = background
        imageView.center = view.center
        view.addSubview(imageView)
        self.view.sendSubview(toBack: imageView)
    }
}

2 个答案:

答案 0 :(得分:1)

从服务器获取数据后创建和显示按钮的代码需要在主UI线程上运行。如果代码正在运行后台线程,它将无法正确显示UI元素,并且在显示控件之前需要一些时间或手动滚动。

在Dispatch主队列上运行代码。

答案 1 :(得分:0)

dispatch_async(dispatch_get_main_queue(),{
   //do some work   
})

OR 相应地覆盖ViewWillLayoutSubviews和ViewDidLayoutSubviews中的一个方法,并在这些方法中运行代码。