SwiftUI - перемещение общих элементов в собственное представление прекращает обновление рендера - PullRequest
0 голосов
/ 22 декабря 2019

У меня есть экран с 8 переключаемыми опциями в List (), когда вы переключаете элемент, он устанавливает свойство объекта на true или false правильно, поэтому я хотел уменьшить код на этой странице с 7 строк кода для каждого элемента до1 строка

ИЗ

Toggle(isOn: $viewRouter.flags.obj1) {
    Text("Option1")
    .foregroundColor(viewRouter.flags.obj1 ? COLOR_BLACK : COLOR_WHITE)
}.padding()
.background(viewRouter.flags.obj1 ? COLOR_LIGHT_GREEN : COLOR_LIGHT_RED)
.cornerRadius(30.0)

Toggle(isOn: $viewRouter.flags.obj2) {
    Text("Option2")
    .foregroundColor(viewRouter.flags.obj2 ? COLOR_BLACK : COLOR_WHITE)
}.padding()
.background(viewRouter.flags.obj2 ? COLOR_LIGHT_GREEN : COLOR_LIGHT_RED)
.cornerRadius(30.0)

TO

ToggleElement(isOn: $viewRouter.flags.obj1, text: "Object1")
ToggleElement(isOn: $viewRouter.flags.obj2, text: "Object2")

Используя следующий код

import SwiftUI

struct ToggleElement: View {
    @Binding var isOn: Bool
    var text: String = "test"

    var body: some View {
        Toggle(isOn: self.$isOn) {
            Text(verbatim: self.text)
            .foregroundColor(isOn ? COLOR_BLACK : COLOR_WHITE)
        }
        .padding()
        .background(isOn ? COLOR_LIGHT_GREEN : COLOR_LIGHT_RED)
        .cornerRadius(30.0)
    }

}

struct ToggleElement_Previews: PreviewProvider {
    @State static var previewIsOn: Bool = true
    static var previews: some View {
        ToggleElement(isOn: self.$previewIsOn, text: "buttonText")
    }
}

Но цвет фона больше не меняется при переключении.

Объекты viewRouter.flags.obj1 и viewRouter.flags.obj2 меняют состояние для меня

Объект флагов

import Foundation
import SwiftUI
import Combine

class FlagObject: ObservableObject {
    @Published var obj1:Bool = false
    @Published var obj2:Bool = false    
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...