Можно ли изменить пользовательский признак из родительской коллекции признаков и наблюдать за изменениями во всех контроIOS

Программируем под IOS
Ответить Пред. темаСлед. тема
Гость
 Можно ли изменить пользовательский признак из родительской коллекции признаков и наблюдать за изменениями во всех контро

Сообщение Гость »


Я пытаюсь создать собственный объект типажа и поместить его в класс UITraitCollection, используя некоторые новые API в iOS 17. В качестве примера я хочу создать несколько свойств темы приложения. , поместите их в класс коллекции признаков и сделайте все доступные на данный момент объекты UIViewController для наблюдения за изменениями признаков темы. Я знаю, что в iOS 17 у UIKit есть новый метод для переопределения определения признака путем изменения нового свойства traitOverrides. Но, основываясь на видеосеансе WWDC23, Apple посоветовала нам использовать это свойство только для определенных контроллеров или представлений представления и всех его дочерних элементов/подпредставлений. Таким образом, изменения не отражаются на всех контроллерах представления, которые в настоящее время доступны в памяти. Вот что я сделал на данный момент:

Создание нового пользовательского UITraitDefinition:

enum ThemeTraitType: Int { чехол свет чехол темный чехол монохромный } struct ThemeTrait: UITraitDefinition { значение typealias = ThemeTraitType статический let defaultValue: ThemeTraitType = .light статическое имя переменной: String = "Тема" статическая переменная влияет на ColorAppearance: Bool = true } Добавил его в класс UITraitCollection с помощью расширений:

расширение UITraitCollection { вар currentTheme: ThemeTraitType { self[ThemeTrait.self] } } расширение UImutableTraits { вар currentTheme: ThemeTraitType { получить {self[ThemeTrait.self] } set { self[ThemeTrait.self] = newValue } } } Зарегистрируйте наблюдателя за изменениями характеристик:

окончательный класс ViewController: UIViewController { переопределить функцию viewDidLoad() { супер.viewDidLoad() RegisterForTraitChanges([ThemeTrait.self], обработчик: { (self: Self, previousTraitCollection: UITraitCollection) в // Сделайте что-нибудь здесь... }) } } Измените признак currentTheme, используя новое свойство traitOverrides:

traitOverrides.currentTheme = .dark Это работает так, как и ожидалось, для контроллера представления, из которого я меняю признак. Но предположим, что я использую UINavigationController и имею 5 контроллеров представления внутри контроллера навигации, и я меняю признак внутри последнего контроллера представления (который является 5-м контроллером представления внутри стека), когда я иду Возвращаясь к предыдущему контроллеру представления, изменения черт не отражаются на всех предыдущих контроллерах представления. Я хочу, чтобы изменения, которые я сделал внутри любых контроллеров представлений, также отражались на всех доступных контроллерах представлений, которые в настоящее время существуют в памяти. Возможно ли это реализовать? Спасибо.
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «IOS»