Как я могу изменить значение глобальной переменной внутри функции?

#ios #swift #if-statement #swiftui #boolean

#iOS #быстрый #if-оператор #свифтуи #логическое значение

Вопрос:

У меня есть @State логическое значение в моем коде, внутри struct которого у меня есть кнопка, которая toggle() его использует. Тем не менее, я хочу использовать эту переменную и в других своих представлениях. Поэтому мне нужно, чтобы он был снаружи struct , чтобы я мог использовать его в другом месте. Мой вопрос заключается в том, как я могу теперь изменить его значение? Ранее моим button действием toggle было это. Как я могу изменить это сейчас?

Вот мой код:

 struct ContentView: View {
    @State var checked: Bool = false
    var body: some View {
     HStack {
            Button(action: {checked.toggle()}) {
                Image(systemName: checked ? "checkmark.square": "square")
                .resizable()
                .aspectRatio(contentMode: .fit)
                .scaledToFit()
                .foregroundColor(.black)
                .frame(height: 20)
            }
            Text("I agree")
            .fontWeight(.bold)
            Spacer()
        }
        .padding(.horizontal, 20)
    }
}
 

Тем не менее, я хочу, чтобы это сработало:

 var checked:Bool = false
struct ContentView: View {
    var body: some View {
     HStack {
            Button(action: {checked.toggle()}) {
                Image(systemName: checked ? "checkmark.square": "square")
                .resizable()
                .aspectRatio(contentMode: .fit)
                .scaledToFit()
                .foregroundColor(.black)
                .frame(height: 20)
            }
            Text("I agree")
            .fontWeight(.bold)
            Spacer()
        }
        .padding(.horizontal, 20)
    }
}
 

Комментарии:

1. Не могли бы вы показать свой код для этого?

2. Я поделился этим.

Ответ №1:

Возможное решение — использовать общий наблюдаемый объект с обернутым этим свойством, тогда его можно будет наблюдать во всех зависимых представлениях.

Вот демонстрация. Протестировано с Xcode 12.1 / iOS 14.1

 class GlobalState: ObservableObject {
    static let shared = GlobalState()
    
    @Published var checked:Bool = false
}

struct myView: View {
    @ObservedObject var gs = GlobalState.shared
    
    var body: some View {
        HStack {
            Button(action: {gs.checked.toggle()}) {
                Image(systemName: gs.checked ? "checkmark.square": "square")
                    .resizable()
                    .aspectRatio(contentMode: .fit)
                    .scaledToFit()
                    .foregroundColor(.black)
                    .frame(height: 20)
            }
            Text("I agree")
                .fontWeight(.bold)
            Spacer()
        }
        .padding(.horizontal, 20)
        Spacer()
    }
}
 

Комментарии:

1. class ViewRouter: ObservableObject { @ObservedObject var globalState = GlobalState.shared init() { if UserDefaults.standard.bool(forKey: "didLaunchBefore") amp;amp; globalState.checked{ //Agreement s checked in OnBoardingView currentPage = "appView" } else { UserDefaults.standard.set(true, forKey: "didLaunchBefore") currentPage = "onboardingView" } } @Published var currentPage: String }

2. Спасибо, это сработало, но когда я добавляю его в этот класс, я получаю сообщение об ошибке.

3. «self» захвачен замыканием до того, как все члены были инициализированы