Я работаю над приложением, которое, как я хочу, будет иметь более одного просмотра. Я создал класс как ObservableObject, чтобы иметь доступ к одним и тем же переменным из нескольких файлов представлений. Я хочу изменить одно логическое значение при щелчке по тексту, и из-за этого логического изменения я хочу, чтобы представление изменилось. Вот мои файлы:
MoodyApp.swift
import SwiftUI
@main
struct MoodyApp: App {
@State var globalVars = vars
var body: some Scene {
WindowGroup {
if (vars.isSettings){
SettingsView()
}
else{
MainView()
}
}
}
}
Основной вид
import SwiftUI
struct MainView: View {
//colors
let darkGrey : Color = Color(red: 62/255, green: 62/255, blue: 62/255);
let grey : Color = Color(red: 86/255, green: 86/255, blue: 86/255);
let lightGrey : Color = Color(red: 117/255, green: 117/255, blue: 117/255);
let dayGrey : Color = Color(red: 206/255, green: 206/255, blue: 206/255);
let white : Color = Color(red: 242/255, green: 242/255, blue: 242/255);
let years = Callendar();
var body: some View {
VStack(){
VStack{
HStack{
Text("menu")
.foregroundColor(white)
.padding()
Spacer()
Text("settings")
.foregroundColor(white)
.padding()
.onTapGesture(){
//HERE I WANT A BOOL TO CHANGE AND THE APP TO UPDATE THE VIEW
}
}
.ignoresSafeArea()
.frame(height: 0.0)
HStack{
Text("2023")
.font(.system(size:36))
.foregroundColor(white)
}
}.background(darkGrey)
ScrollView(showsIndicators: false){
ForEach(0..<12) { index in
Text(years.month[index])
.font(.system(size:36))
.foregroundColor(white)
.padding(.bottom, -8)
ZStack{
RoundedRectangle(cornerRadius: 45, style: .continuous)
.fill(lightGrey)
.frame(width: 320, height: 320)
ForEach(0..<years.quantity[index], id: \.self){ value in
let x = CGFloat(years.positionX[index][value])
let y = CGFloat(years.positionY[index][value])
RoundedRectangle(cornerRadius: 7, style: .continuous)
.fill(dayGrey)
.frame(width: 30, height: 30)
.position(x: x, y: y);
Text(String(value+1))
.position(x: x, y: y)
.foregroundColor(.black);
}
}
}
}
}.background(grey)
.statusBar(hidden: true)
}
}
struct MainView_Previews: PreviewProvider {
static var previews: some View {
MainView()
}
}
А вот и глобальные переменные
import Foundation
class GlobalVars: ObservableObject {
@Published var isSettings = false
}
var vars = GlobalVars()
Переменная меняется правильно, я попытался изменить ее после щелчка и распечатать в консоли. похоже, что основной файл приложения не распознает изменение ?? Я действительно не знаю, как решить эту проблему, недавно я начал работать в Swift. Любая помощь будет здорово.





Проблема здесь:
@State var globalVars = vars
неправильно. Это должно быть @StateObject:
@StateObject var globalVars = vars
и его запуск будет выглядеть так:
vars.isSettings = true
Хотя этот подход с глобальной переменной может работать, это не очень быстрый способ решить эту проблему. Вы должны инициализировать экземпляр GlobalVars в своей структуре App, а затем передать его в свою среду Views. Затем вытащите его из окружающей среды и манипулируйте им.
например.:
struct MoodyApp: App {
@StateObject var globalVars = GlobalVars()
var body: some Scene {
WindowGroup {
if (globalVars.isSettings){
SettingsView()
.environmentObject(globalVars)
}
else{
MainView()
.environmentObject(globalVars)
}
}
}
а затем в представлении:
@EnvironmentObject private var globalVars: GlobalVars
и в onTapGesture:
globalVars.isSettings = true