SwiftUI: обнаружение изменений @State в их @Binding

Я пытаюсь понять, как можно изменить значение с другого View. Вот реализация моего основного представления:

import SwiftUI
import Combine

struct ContentView: View {
    @State private var isPresented: Bool = false
    
    @State private var textToProces = "" {
        didSet{
            print("text: oldValue=\(oldValue) newValue=\(textToProces)")

        }
    }
    var body: some View {
       
        ZStack{
            VStack{
                Button("Show Alert"){
                    self.isPresented = true
                }.background(Color.blue)
            }
            ItemsAlertView(isShown: $isPresented, textToProcess: $textToProces)
        }
    }
}

С этой точки зрения я пытаюсь изменить textToProces переменная:

struct AnotherView: View {
    
    @Binding var isShown: Bool
    @Binding var textToProcess: String

    var title: String = "Add Item"
    let screenSize = UIScreen.main.bounds
    
    var body: some View {
        VStack {
            Button(action: {
                self.textToProcess = "New text"
                self.isShown = false
            }, label: {
                Text("dissmis")
            })
            Text(self.textToProcess)
        }
        .background(Color.red)
        .offset(y: isShown ? 0 : screenSize.height)
    }
}

Когда я изменяю значение в этой строке self.textToProcess = "New text" в textToProcessв главном представлении никогда не получает уведомление об изменении. Что я могу сделать, чтобы получить уведомление об изменении основного представления, которое знает кто-нибудь из вас?

Я очень признателен за вашу помощь

1 ответ

Решение

Вы должны использовать onChange модификатор для отслеживания изменений в textToProces.

import SwiftUI
import Combine

struct ContentView: View {
    @State private var isPresented: Bool = false
    
    @State private var textToProces = ""

    var body: some View {
       
        ZStack{
            VStack{
                Button("Show Alert"){
                    self.isPresented = true
                }.background(Color.blue)
            }
            ItemsAlertView(isShown: $isPresented, textToProcess: $textToProces)
        }
        .onChange(of: textToProces) { value in
            print("text: \(value)")
        }
    }
}
Другие вопросы по тегам