Итак, я нашел решение. У меня есть идея о том, почему это работает, но я не знаю технически, почему это работает. Я думаю, что это как-то связано с тем, как 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
. Если бы кто-нибудь мог сказать мне, почему это работает, я был бы благодарен.