Всем привет. Значит поступила задача сделать приложение для часов и представилась возможность более детально изучить SwiftUI.
Сразу к сути вопроса.
1-й экран простой список сессий
@EnvironmentObject var sessionManager: WatchSessionManager
var body: some View {
NavigationView {
List($sessionManager.sessionList) { s in
NavigationLink(destination: SessionStartView(session: s) {
SessionRow(session: s)
}
}
.listStyle(.elliptical)
.navigationBarTitle("Sessions")
}
}
2-й экран детали сессии
@Binding var session: SessionModel
@State var isRunning = false
var body: some View {
VStack {
//вывод данных сессии
}
.toolbar {
ToolbarItem(placement: .cancellationAction) {
Button {
isRunning.toggle()
startStopSession() // тут идет изменение модели session
} label: {
Text(isRunning ? "Stop" : "Start")
}
}
}
.onChange(of: session.status) { newValue in
print("Status has changed")
}
}
Ситуация следующая: в WatchSessionManager приходит команда с телефона на остановку сессии
if let id = response[CommandKeys.stopSession.rawValue] as? String,
let session = sessionList.first(where: { $0.id == id && $0.status == true }) {
session.status = false
statusChanged(for: session) // тут идет обновление sessionList
}
Так вот, при этом 1-й экран обновляется. Как подхватить это обновление на 2-м экране, что бы там сделать обновление UI?
Я вспомнил о методе .onChange(), который прописал. Он срабатывает, но, он так же срабатывает на изменения при действии юзера, если нажать на ToolbarItem. Можно конечно добавить дополнительные флаги, что бы проверять не было ли это от юзера или от телефона, но вдруг есть способ более красивый.
Пока мне ничего не приходит в голову.
Призываю @ODiN’a