Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Глобальная переменная в Swiftui

Автор вопроса: user6539552Ответов: 1

У меня есть перечисление, которое определяет индекс языка. Я поместил это перечисление в файл с именем Language.swift

enum Language: Int {
    case en
    case zh_hant
}

Я попытался объявить глобальную переменную, в которой хранится текущий язык.

final class ModelData: ObservableObject {
    @Published var currentLanguage: Language = Language.zh_hant
    @Published var globalString: [String] = load("strings.json")
}

Однако, когда я попытался получить к нему доступ, у меня возникла следующая ошибка:

struct HomeView: View {

    @EnvironmentObject var modelData: ModelData

    var body: some View {
        Text("\(modelData.currentLanguage.rawValue)") // error, see the screen capture
        Text("\(modelData.globalString.count)") // no problem
    }
}

Тем не менее, я использовал тот же способ доступа к массиву, нет проблем.

Вышеупомянутую ошибку можно устранить, переместив enum Language в тот же файл, что и класс ModelData.

Однако тогда была выявлена ​​другая проблема.

Я попытался сделать это в своем коде:

var languageIndex: Int {
        modelData.currentLanguage.rawValue
    }
var body: some View {
    Text("\(modelData.globalString[languageIndex])") // preview cause "updating took more than 5 seconds]
}

Моя глобальная строка похожа на эту [Привет,]

Проблема появляется в представлении холста при предварительном просмотре пользовательского интерфейса. Тем не менее, похоже, что в симуляторе он работает нормально. Любая идея?

  • Нет ошибок с Xcode 12.1, просто скопируйте / вставьте код. Возможно, у вас есть конфликт с другим кодом в вашем проекте. Asperi 24.01.2021
  • Я поместил перечисление Language в файл с именем Language.swift и, следовательно, вызвал ошибку. Я не могу поместить их в другой файл, отличный от класса ModelData? user6539552 24.01.2021

swiftui

Ответы

Ответ 1 · рейтинг 1 · MilesStanfield

Проблема появляется в представлении холста при предварительном просмотре пользовательского интерфейса. Тем не менее, похоже, что в симуляторе он работает нормально.

Вы должны установить объект среды в предварительном просмотре

struct HomeView_Previews: PreviewProvider {
  static var previews: some View {
    HomeView()
      .environmentObject(ModelData())
  }
}

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы