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

标签 ios swift uiview

我有一个 UIViewController(主菜单),它在我的另一个 UIViewController(加载屏幕)完成从 Web 下载/同步数据后显示。我的主菜单有问题,因为它在出现时并不总是显示 View 中的所有 UIButton!有一个不一致的地方,主菜单每加载 10 次,就有 1 次会出现所有 UIButton。

View 应如下所示:Correct View

View 通常是这样显示的:How it shows up

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

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

如果我让屏幕闲置 30 秒左右,所有 UIButton 将随机出现,而无需我手动让它们出现。

如果我从加载屏幕以外的应用程序的任何部分转到主菜单 View ,则主菜单 View 是正常的,所有 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)
    }
}

最佳答案

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

在 Dispatch 主队列上运行代码。

关于ios - Swift 3 - UIView 并不总是显示其内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41268742/

相关文章:

ios - 使用 renderInContext : for masks created by cgpaths

ios - 方法不是在 iPhone 中调用而是在 iOS 模拟器中调用

ios - Swift 3 UIWebView 在 Safari 中打开(视频中的 YouTube Logo /水印超链接)

ios - 删除项目然后添加到 UITableView 时出现异常

ios - Realm() 初始化返回 nil

ios - UICollisionBehavior的问题

ios - 我应该如何构建这个 View ?

ios - 使用 LBYouTube 在 UIView 中打开 YouTube 视频

iphone - iOS:使用 sizeWithFont:constrainedToSize:lineBreakMode 的 UILabel 动态高度:不起作用

ios - View drawRect 仅在延迟后调用