使用情节提要设置标签文本时出现短暂滞后

Short lag when setting label text using storyboards

在我的应用程序中,我有一个 mainViewController 上面有一些内容。在某些时候,我从情节提要中加载了一个覆盖视图控制器。 overlay view controller 比屏幕小,显示在 mainViewController 之上。我按以下方式初始化它:

class MyOverlayViewController {
    @IBOutlet var textLabel: UILabel!
    @IBOutlet var countLabel: UILabel!

    static let storyboard = UIStoryboard(name: "...", bundle: nil)

    // Return a new view controller
    class func newViewControllerWithData(data: AnyObject) -> UIViewController {
        let vc = storyboard.instantiateViewControllerWithIdentifier("MyOverlayViewController") as! MyOverlayViewController

        Timing.performAfterDelay(0) {
            vc.titleLabel.text = data[...] // Load title label text
            vc.countLabel.text = data[...] // Load count label text
        }

        return vc
    }
}

我无法在方法 newViewControllerWithData 中立即设置标签的文本,因为这会产生以下错误: fatal error: unexpectedly found nil while unwrapping an Optional value. 所以标签在立即访问时是 nil方法。

当视图控制器从情节提要中实例化时,这两个标签插座似乎没有立即加载,因为这需要(非常)短的时间。

因此,我使用我的方法 Timing.performAfterDelay(0) 在下一个 运行 循环后执行代码(它启动一个持续时间为 0 的计时器并执行代码作为回调) .代码(我已经检查过了)在主线程上执行。

问题如下:
有时(不总是,而且不可重现!),当加载覆盖视图控制器时,标签在几分之一秒内是 empty (就像我在情节提要中定义它们一样)之前显示文本。 因此,在将实际数据加载到标签之前,用户会在短时间内看到空标签。

我该如何解决这个问题?
从情节提要中实例化视图控制器后,是否有可能以某种方式立即访问插座,而不使用 Timing.performAfterDelay(0)?

不胜感激。

插座设置 视图加载后,即在视图控制器上调用 viewDidLoad 时。但是,像 vc.viewDidLoad() 那样直接调用它是行不通的,您必须像 let dummyVariable = vc.view 那样访问视图控制器的视图。这是强制加载视图然后设置标签值的代码。

class func newViewControllerWithData(data: AnyObject) -> UIViewController {
    let vc = storyboard.instantiateViewControllerWithIdentifier("MyOverlayViewController") as! MyOverlayViewController
    let _ = vc.view // force load the view
    // now set your outlets as you please
    vc.titleLabel.text = data[...] // Load title label text
    vc.countLabel.text = data[...] // Load count label text
    return vc
}

注意:但这并不是一个好的做法。 MyOverlayViewController 应该负责设置其标签值,而不是从外部设置这些值。您可以通过 属性 或方法的参数等将所需数据传递给它