使用情节提要设置标签文本时出现短暂滞后
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 应该负责设置其标签值,而不是从外部设置这些值。您可以通过 属性 或方法的参数等将所需数据传递给它
在我的应用程序中,我有一个 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 应该负责设置其标签值,而不是从外部设置这些值。您可以通过 属性 或方法的参数等将所需数据传递给它