有2个视图(结构)。
第一个视图具有@state更新:
struct SettingsView: View {
@State private var lang = 0
@State private var languages = ["English", "Spanish"]
@State private var text1 = "Close"
@State private var text2 = "Settings"
@State var show = false
@State var update = false
var body: some View {
ZStack{
Button(action: {
self.show.toggle()
}) {
Text("Choose language")
}
if self.$show.wrappedValue {
GeometryReader {proxy in
ChooseLanguage(show: self.$show, update: self.$update)
}.background(Color.black.opacity(0.65)
.edgesIgnoringSafeArea(.all)
.onTapGesture {
withAnimation{
self.show.toggle()
}
})
}
}.onAppear{
switch UserDefaults.standard.string(forKey: "languageSettings"){
case "en": self.lang = 0
case "es": self.lang = 1
default: return
}
self.updateLanguage()
}
func updateLanguage(){
if self.lang == 1 {
self.text1 = "Cerrar"
self.text2 = "Configuración"
self.languages = ["Inglés", "Español"]
} else {
self.text1 = "Close"
self.text2 = "Settings"
self.languages = ["English", "Spanish"]
}
}
}
}
第二个视图具有@Binding更新:
import SwiftUI
struct ChooseLanguage : View {
var languages = UserDefaults.standard.stringArray(forKey: "langlist")
@Binding var show: Bool
@Binding var update: Bool
var body: some View {
ZStack {
VStack {
Button(action: {
UserDefaults.standard.set("en", forKey: "languageSettings")
UserDefaults.standard.set(["English", "Spanish"], forKey: "langlist")
self.show.toggle()
self.update = true
}) {
Text(languages![0])
}
Button(action: {
UserDefaults.standard.set("es", forKey: "languageSettings")
UserDefaults.standard.set(["Inglés", "Español"], forKey: "langlist")
self.show.toggle()
self.update = true
}) {
Text(languages![1])
}
}
}
}
}
当我在func updateLanguage()
之前致电.onAppear
时,只会出现错误。
为什么我可以通过onAppear
中的函数更新值,而不能通过wrappedValue
中的函数更新值?
if self.$update.wrappedValue {
self.updateLanguage()
self.update.toggle()
}
如果放在}.onAppear
之前,此部分不起作用
答案 0 :(得分:1)
据我所知,可以使用init()方法简化视图。
您可以在其中声明并初始化所有具有正确值的@State变量(取决于UserDefaults)
仅向您展示一个示例:
struct SetView: View {
@State private var lang : Int
@State private var languages : [String]
@State private var text1 : String
@State private var text2 : String
@State var show = false
@State var update = false
init()
{
var state : Int = 0
switch UserDefaults.standard.string(forKey: "languageSettings")
{
case "en": state = 0
case "es": state = 1
default:
//Default value here
state = 0
}
if state == 1 {
self._lang = State(initialValue: state)
self._text1 = State(initialValue: "Cerrar")
self._text2 = State(initialValue: "Configuración")
self._languages = State(initialValue: ["Inglés", "Español"])
} else {
self._lang = State(initialValue: state)
self._text1 = State(initialValue: "Close")
self._text2 = State(initialValue: "Settings")
self._languages = State(initialValue: ["English", "Spanish"])
}
}
从头开始使用正确的值初始化State变量时,您根本不需要onAppear
方法。
我还没有测试过。上面的代码只是我的脑海。
答案 1 :(得分:0)
在更改@State upload
值之后,无需调用函数,而是更容易将每个文本的绑定发送到弹出视图。
GeometryReader {proxy in
ChooseLanguage(show: self.$show,
text1: self.$text1,
text2: self.$text2,
languages: self.$languages)
}