Как я могу запустить действие, когда переключается swiftUI toggle ()? - PullRequest
0 голосов
/ 11 июля 2019

В моем представлении SwiftUI я должен запускать действие, когда Toggle () меняет свое состояние.Сам тумблер принимает только привязку.Поэтому я попытался вызвать действие в didSet переменной @State.Но didSet никогда не вызывается.

Есть ли какой-либо (другой) способ вызвать действие?Или каким-либо образом наблюдать изменение значения переменной @State?

Мой код выглядит следующим образом:

struct PWSDetailView : View {

    @ObjectBinding var station: PWS
    @State var isDisplayed: Bool = false {
        didSet {
            if isDisplayed != station.isDisplayed {
                PWSStore.shared.toggleIsDisplayed(station)
            }
        }
    }

    var body: some View {
            VStack {
                ZStack(alignment: .leading) {
                    Rectangle()
                        .frame(width: UIScreen.main.bounds.width, height: 50)
                        .foregroundColor(Color.lokalZeroBlue)
                    Text(station.displayName)
                        .font(.title)
                        .foregroundColor(Color.white)
                        .padding(.leading)
                }

                MapView(latitude: station.latitude, longitude: station.longitude, span: 0.05)
                    .frame(height: UIScreen.main.bounds.height / 3)
                    .padding(.top, -8)

                Form {
                    Toggle(isOn: $isDisplayed)
                    { Text("Wetterstation anzeigen") }
                }

                Spacer()
            }.colorScheme(.dark)
    }
}

Желаемым поведением будет то, что действие "PWSStore.shared.toggleIsDisplayed (станция) "срабатывает, когда Toggle () меняет свое состояние.

Ответы [ 2 ]

1 голос
/ 12 июля 2019

Во-первых, знаете ли вы, что дополнительные уведомления KVO для station.isDisplayed являются проблемой? У вас проблемы с производительностью? Если нет, то не беспокойтесь об этом.

Если у вас возникли проблемы с производительностью, и вы установили, что они вызваны чрезмерным station.isDisplayed уведомлениями KVO, то следующая вещь, которую нужно попробовать, - удалить ненужные уведомления KVO. Вы делаете это, переключаясь на ручные уведомления KVO.

Добавьте этот метод к определению класса station:

@objc class var automaticallyNotifiesObserversOfIsDisplayed: Bool { return false }

И используйте наблюдатели Swift willSet и didSet, чтобы вручную уведомить наблюдателей KVO, но только если значение изменяется:

@objc dynamic var isDisplayed = false {
    willSet {
        if isDisplayed != newValue { willChangeValue(for: \.isDisplayed) }
    }
    didSet {
        if isDisplayed != oldValue { didChangeValue(for: \.isDisplayed) }
    }
}
0 голосов
/ 19 июля 2019

Вы можете попробовать это (это обходной путь):

@State var isChecked: Bool = true
@State var index: Int = 0
Toggle(isOn: self.$isChecked) {
        Text("This is a Switch")
        if (self.isChecked) {
            Text("\(self.toggleAction(state: "Checked", index: index))")
        } else {
            CustomAlertView()
            Text("\(self.toggleAction(state: "Unchecked", index: index))")
        }
    }

А под ним создайте такую ​​функцию:

func toggleAction(state: String, index: Int) -> String {
    print("The switch no. \(index) is \(state)")
    return ""
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...