Matt正确地指出,我的原始项目在状态恢复方面存在错误。但是,即使将其删除,只要我在导航控制器内使用表格视图并尝试将isTranslucent
的{{1}}属性设置为UINavigationBar
,就能够重现问题。通过外观代理。
由于某些原因,当iOS恢复状态时,UIAppearance会覆盖false
中设置的值。这让我很头疼,我想知道如何解决这个问题。我将其视为错误。
Here是我在GitHub上创建的一个小项目,用于说明此问题。首次启动时,viewDidLoad
中标签的字体已正确设置为22点。但是,如果触发状态恢复,则由于ViewController
中的出现方法,它将为12点。
实际上,此问题的原因并非我最初认为的willFinishLaunching
。相反,UILabel.appearance(whenContainedInInstancesOf: [UITableViewCell.self]).font = UIFont.systemFont(ofSize: 12)
会导致这种行为。您可以轻松地自己验证。
解决此问题的一种方法是在UINavigationBar.appearance(whenContainedInInstancesOf: [GLXNavigationController.self]).isTranslucent = false
中再次设置字体,因为外观代理是在调用layoutSubviews
之前应用的。但是,我不喜欢这种方法。
另一种可能的解决方案是为每个导航控制器手动设置layoutSubviews
。这是我选择的解决方案,但我仍然觉得外观代理存在错误。至少,我们应该期望初始启动和状态恢复之间的行为一致。
非常感谢您的帮助。
答案 0 :(得分:2)
您正在做错误的状态恢复:
将didFinishLaunchingWithOptions
更改为willFinishLaunchingWithOptions
。
并确保willFinishLaunchingWithOptions
包含对makeKeyAndVisible
窗口的调用,即使它不包含其他内容。
与shouldSaveApplicationState
和shouldRestoreApplicationState
的实现一起,构成了状态保存和恢复的任何实施所需的底层模板。