Решение:
После некоторого рытья у меня есть рабочее решение, но мне все еще интересно, есть ли способ изменить свойства других структур, сохраняя динамические c обновления просмотра .
Решение: хранить данные для отображения в наблюдаемом объекте, который будет либо читать, либо действовать как модель, с которой взаимодействует пользователь.
Наблюдаемый объект - это настраиваемый объект для ваши данные, которые можно привязать к представлению из хранилища в среде SwiftUI. SwiftUI отслеживает любые изменения наблюдаемых объектов, которые могут повлиять на представление, и отображает правильную версию представления после изменения. -apple
Объявлен новый тип модели, который соответствует протоколу ObservableObject из платформы Combine. SwiftUI подписывается на наблюдаемый объект и обновляет соответствующие представления, которые необходимо обновлять при изменении данных. SceneDelegate.swift должен иметь модификатор .environmentObject(_:)
, добавленный в ваше root представление.
Свойства, объявленные в ObservableObject, должны иметь значение @Published
, чтобы подписчики принимали любые изменения.
Для тестового кода я создал объект ObservableObject с именем штаб-квартира
import SwiftUI
import Combine
final class hq: ObservableObject {
@Published var info = headQuarters
}
let headQuarters = hqData(id: 3)
struct hqData {
var id: Int
mutating func bump() {
self.id += 1
}
}
В моем struct dispatch
я подписался на объект и вызвал функцию, которая повторяла идентификатор в модели при каждом нажатии кнопки. Мой struct cop
также подписался на объект, поэтому модель и текст кнопки обновлялись в соответствии с изменениями.
struct dispatch: View {
@EnvironmentObject private var hq: headqarters
var body: some View {
Button(action: {self.hq.info.bump()}) {
Text("Button")
}
}
}
struct cop: View {
@EnvironmentObject private var hq: headquarters
var body: some View {
Text(String(self.hq.info.id))
}
}