Исходный цвет не устанавливается должным образом (Swift UI) - PullRequest
0 голосов
/ 11 апреля 2020

У меня есть библиотека Color из Swift UI как часть состояния моего просмотра. Я пытаюсь установить цвет моего вида при инициализации, но цвет не установлен правильно.

Вот мой код:

struct CalcButtonView: View {
    var calcButton: CalcButton
    var highlightAble: Bool = false
    @State var foregroundColor: Color? = nil
    @State var backgroundColor: Color? = nil
    @State private var highlighted: Bool = false

    @EnvironmentObject var numObservable: NumObservable

    init(newCalcButton: CalcButton){

        /// Buttons that are light gray
        let lightGrayButtons: [String] = ["C", "+/-", "%"]
        /// Buttons that are orange
        let orangeButtons: [String] = ["/", "x", "-", "+", "="]

        self.calcButton = newCalcButton
        self.highlighted = false
        self.foregroundColor = Color.white
        if lightGrayButtons.contains(self.calcButton.label){
            self.backgroundColor = Color.lightGray
            self.highlightAble = false
        } else if orangeButtons.contains(self.calcButton.label){
            self.backgroundColor = Color.orange
            self.highlightAble = true
        } else {
            self.backgroundColor = Color.darkGray
            self.highlightAble = false
        }
    }

}

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

Я думаю, это как-то связано с моей структурой Color, установленной на nil. Мысли?

Как и требовалось, вот моя реализация body:

    var body: some View {
        Button(action: {
            self.numObservable.updateOrOperationDelegate(buttonLabel: self.calcButton.label)
            self.toggleHighLight()
        }, label:{
            Text(calcButton.label)
                .background(self.backgroundColor)
                .foregroundColor(self.foregroundColor)
                .cornerRadius(75)
        })
    }

Обновление № 2: После дополнительного тестирования я обнаружил, что мои переменные foregroundColor и backgroundColor все еще nil даже после запуска моей init функции. Кто-нибудь знает, как это может быть?

1 Ответ

0 голосов
/ 12 апреля 2020

Итак, я нашел решение. У меня есть идея о том, почему это работает, но я не знаю технически, почему это работает. Я думаю, что это как-то связано с тем, как Swift обрабатывает @State. Причина, по которой я думаю , что мой оригинальный код не работает, заключается в том, что @State еще не готова к установке.

Как только я переместил свой код за пределы части инициализации, он заработал. Вот мой код, который достигает моей первоначальной цели:

struct CalcButtonView: View {

    var calcButton: CalcButton
    var highlightAble: Bool
    @State var buttonForeground: Color = Color.white
    @State var buttonBackGround: Color?
    @State private var highlighted: Bool = false

    @EnvironmentObject var numObservable: NumObservable

    init(newCalcButton: CalcButton){
        let orangeButtons: [String] = ["/", "x", "-", "+", "="]

        self.highlightAble = false
        self.calcButton = newCalcButton
        self.highlighted = false
        if orangeButtons.contains(self.calcButton.label){
            self.highlightAble = true
        }

    }

    var body: some View {
        Button(action: {
            self.numObservable.updateOrOperationDelegate(buttonLabel: self.calcButton.label)
            self.toggleHighLight()
        }, label:{
            Text(calcButton.label)
                .background(self.buttonBackGround)
                .foregroundColor(self.buttonForeground)
                .cornerRadius(75)
        }).onAppear {
            /// Buttons that are light gray
            let lightGrayButtons: [String] = ["C", "+/-", "%"]
            /// Buttons that are orange
            let orangeButtons: [String] = ["/", "x", "-", "+", "="]
            if lightGrayButtons.contains(self.calcButton.label){
                self.buttonBackGround = Color.lightGray
            } else if orangeButtons.contains(self.calcButton.label){
                self.buttonBackGround = Color.orange
            } else {
                self.buttonBackGround = Color.darkGray
            }
        }
    }
}

Изменения в части .onAppear. Все, что я сделал, это переместил мои background и foreground logi c в .onAppear. Если бы кто-нибудь мог сказать мне, почему это работает, я был бы благодарен.

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