Ошибка UIAppearance при восстановлении состояния - PullRequest
0 голосов
/ 26 сентября 2018

Обновление

Мэтт правильно указал, что в моем исходном проекте произошла ошибка с восстановлением состояния.Однако даже после его удаления я могу воспроизвести проблему, если использую табличное представление внутри контроллера навигации и пытаюсь установить для свойства isTranslucent для UINavigationBar значение false через прокси-сервер внешнего вида.


По какой-то причине, когда iOS восстанавливает состояние, UIAppearance переопределяет значения, установленные в viewDidLoad.Это вызывает у меня много головной боли, и я хотел бы знать, как решить эту проблему.Я рассматриваю это как ошибку.

Здесь - это небольшой проект, который я создал на GitHub для иллюстрации этой проблемы.Когда вы запускаете его в первый раз, шрифт метки в ViewController правильно установлен на 22 пункта.Однако, если вы инициируете восстановление состояния, это будет 12 баллов из-за метода появления в willFinishLaunching.

На самом деле, причина этой проблемы не в UILabel.appearance(whenContainedInInstancesOf: [UITableViewCell.self]).font = UIFont.systemFont(ofSize: 12), как я изначально думал.Вместо этого UINavigationBar.appearance(whenContainedInInstancesOf: [GLXNavigationController.self]).isTranslucent = false вызывает такое поведение.Вы можете легко проверить это самостоятельно.

Один из способов решить эту проблему - снова установить шрифт в layoutSubviews, поскольку прокси внешнего вида применяются непосредственно перед вызовом layoutSubviews.Однако мне не нравится этот подход.

Другое возможное решение - установить isTranslucent вручную для каждого контроллера навигации.Это решение, которое я выбираю, но я все еще чувствую, что есть ошибка с внешним видом прокси.Как минимум, мы должны ожидать согласованного поведения между первоначальным запуском и восстановлением состояния.

Любая помощь очень ценится.

1 Ответ

0 голосов
/ 26 сентября 2018

Вы делаете восстановление состояния неправильно:

  • Измените didFinishLaunchingWithOptions на willFinishLaunchingWithOptions.

  • И убедитесь, что willFinishLaunchingWithOptions содержит вызов к окну makeKeyAndVisible, даже если оно ничего больше не содержит.

Товместе с реализациями shouldSaveApplicationState и shouldRestoreApplicationState представляет собой базовый шаблон, необходимый для любой реализации сохранения и восстановления состояния.

...