【发布时间】:2016-01-28 20:59:41
【问题描述】:
在我的应用程序中,我有一个mainViewController,上面有一些内容。在某些时候,我从情节提要加载了一个覆盖视图控制器。覆盖视图控制器比屏幕小,呈现在 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) 的情况下立即访问插座?
我们将不胜感激。
【问题讨论】:
标签: ios swift uiviewcontroller storyboard uistoryboard