#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» захвачен замыканием до того, как все члены были инициализированы