我有一个UIViewController(主菜单),在我的其他UIViewController(加载屏幕)完成从网上下载/同步数据后显示。我的主菜单出现问题,因为它不会始终显示视图上显示的所有UIButton!有一个不一致,主菜单加载每10次中有1次,所有UIButton都会出现。
我可以将手指放在UIButton所在的位置,然后将手指移开,它们会出现。我也可以点击他们应该的位置,我的segue仍将触发,但UIButtons不会自动显示。它看起来像
我尝试将一个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)
}
}
答案 0 :(得分:1)
从服务器获取数据后创建和显示按钮的代码需要在主UI线程上运行。如果代码正在运行后台线程,它将无法正确显示UI元素,并且在显示控件之前需要一些时间或手动滚动。
在Dispatch主队列上运行代码。
答案 1 :(得分:0)
dispatch_async(dispatch_get_main_queue(),{
//do some work
})
OR 相应地覆盖ViewWillLayoutSubviews和ViewDidLayoutSubviews中的一个方法,并在这些方法中运行代码。