状态恢复期间的 UIAppearance 错误

UIAppearance bug during state restoration

更新

Matt 正确地指出我的原始项目在状态恢复方面存在错误。但是,即使在删除它之后,只要我在导航控制器中使用 table 视图并尝试设置 isTranslucent 属性 of [=11],我就能够重现问题=] 到 false 通过外观代理。


出于某种原因,当 iOS 恢复状态时,UIAppearance 会覆盖 viewDidLoad 中设置的值。这让我很头疼,我想知道如何解决这个问题。我认为这是一个错误。

Here 是我在 GitHub 上创建的一个小项目来说明这个问题。首次启动时,ViewController 中的标签字体已正确设置为 22 磅。但是,如果触发状态恢复,因为willFinishLaunching.

中的出现方式,所以会是12点

其实这个问题的起因并不是我原先想的UILabel.appearance(whenContainedInInstancesOf: [UITableViewCell.self]).font = UIFont.systemFont(ofSize: 12)。相反,UINavigationBar.appearance(whenContainedInInstancesOf: [GLXNavigationController.self]).isTranslucent = false 会导致这种行为。你可以很容易地自己验证一下。

解决此问题的一种方法是在 layoutSubviews 中再次设置字体,因为外观代理是在调用 layoutSubviews 之前应用的。但是,我不喜欢这种做法。

另一种可能的解决方案是为每个导航控制器手动设置 isTranslucent。这是我选择的解决方案,但我仍然觉得外观代理存在错误。至少,我们应该期望初始启动和状态恢复之间的行为一致。

非常感谢任何帮助。

你的状态恢复错误:

  • didFinishLaunchingWithOptions 更改为 willFinishLaunchingWithOptions

  • 并确保 willFinishLaunchingWithOptions 包含对 window 到 makeKeyAndVisible 的调用,即使它不包含任何其他内容。

这与 shouldSaveApplicationStateshouldRestoreApplicationState 的实施一起构成了 any 状态保存和恢复实施所需的底层样板。