Основываясь на ваших комментариях - и поправьте меня, где не так - вот как я это настрою.
Ваши потребности:
- Базовый класс. Назовите это
MasterView
, «настройки», «состояние просмотра», как угодно. Это где все начинается. - "текущая игра" .... ну, это могут быть
struct
, class
, даже свойства в ObservableObject
.
Я думаю, вот и все. Иерархически ваша модель может быть:
ViewState
... Player
...... Свойства, включая идентификатор и историю
... Текущая игра
...... Свойства, включая сложность
Обратите внимание, я изменил некоторые имена и сейчас очень расплывчато по свойствам. Дело в том, что вы можете инкапсулировать все этого в ObservableObject
, создать его «EnvironmentObject» и заставить все ваши представления SwiftUI «реагировать» на изменения в нем.
Выйдя из представлений, мы надеемся, что вы сможете увидеть, где эта «модель» может содержать практически весь код Swift, который вы хотите сделать все - теперь все, что вам нужно, это связать свои представления.
(1) Создайте свой ObservableObject
. Для необходимо , чтобы (a) быть объектом класса и (b) соответствовать протоколу ObservableObject
. Вот простой:
class ViewState : ObservableObject {
var objectWillChange = PassthroughSubject<Void, Never>()
@Published var playerID = "" {
willSet {
objectWillChange.send()
}
}
}
Вы можете создавать больше структур / классов и создавать их экземпляры по мере необходимости в вашей модели.
(2) Создавать ViewState
один раз мин вашей среде. В SceneDelegate
:
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
if let windowScene = scene as? UIWindowScene {
let window = UIWindow(windowScene: windowScene)
window.rootViewController = UIHostingController(rootView: ContentView()
.environmentObject(ViewState())
)
self.window = window
window.makeKeyAndVisible()
}
}
Обратите внимание, что здесь добавляется одна строка и ViewState
создается один раз.
(3) Наконец, в any Представление SwiftUI, которому необходимо знать состояние вашего представления, свяжите его, добавив одну строку кода:
@EnvironmentObject var model: ViewState
Если вы хотите, вы можете делать практически все в вашей модели (ViewState
) из создание экземпляра новой игры, отметка чего-либо, что приводит к модальному всплывающему окну, добавление игрока в массив, что угодно.
Главное, что я надеюсь объяснить, - нет необходимости создавать экземпляр второе состояние просмотра - скорее создайте экземпляр второго игрового экземпляра внутри вашего единственного состояния просмотра.
Опять же, если я далеко от ваших потребностей, дайте мне знать - яс удовольствием удалю мой ответ. Удачи!