Почему не работает функция обновления SwiftUI? - PullRequest
1 голос
/ 17 июня 2020

Есть 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

Ответы [ 2 ]

1 голос
/ 17 июня 2020

Насколько я понимаю, вы можете сделать это намного проще, используя метод 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"])
        }
    }

You вообще не понадобится метод onAppear, когда вы инициализируете свои переменные состояния с правильным значением с самого начала.

Я еще не тестировал его. Код выше просто не в моем уме.

0 голосов
/ 17 июня 2020

Вместо вызова функции после изменения значения @State upload проще отправлять привязки для каждого текста во всплывающее окно.

GeometryReader {proxy in

                    ChooseLanguage(show: self.$show,
                                   text1: self.$text1,
                                   text2: self.$text2,
                                   languages: self.$languages)

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...