Обновлять
Мэтт правильно заметил, что в моем первоначальном проекте была ошибка с восстановлением состояния. Однако даже после его удаления я могу воспроизвести проблему, если использую табличное представление внутри навигационного контроллера и пытаюсь установить свойство 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
вручную для каждого навигационного контроллера. Это решение, которое я выбираю, но я все еще чувствую, что есть ошибка с прокси-сервером внешнего вида. Как минимум, мы должны ожидать последовательного поведения между начальным запуском и восстановлением состояния.
Любая помощь горячо приветствуется.
didFinishLaunching
, а также очень важно, чтобыwindow?.makeKeyAndVisible()
явно отображалось вwillFinishLaunching
. - person matt   schedule 26.09.2018makeKeyAndVisible
решает эту проблему. Моя логика размещения его вdidFinishLaunching
заключалась в том, что еслиViewController
восстанавливается, нам не нужно его устанавливать. В противном случае, если восстановление состояния не происходит, нам нужно установить его. - person Andriy Gordiychuk   schedule 26.09.2018willFinishLaunching
, а что вdidFinishLaunching
? Я немного борюсь с этим. Весь мой пользовательский интерфейс создается программно - person Andriy Gordiychuk   schedule 26.09.2018makeKeyAndVisible
в своем ответе; Я внесу поправку. — Если вы занимаетесь сохранением и восстановлением состояния, все должно находиться вwillFinishLaunching
, насколько я понимаю. - person matt   schedule 26.09.2018didFinishLaunching
. - person Andriy Gordiychuk   schedule 26.09.2018