Как вызвать действие, как только наблюдаемая переменная SwiftUI изменит свое значение - PullRequest
1 голос
/ 02 февраля 2020

У меня есть список в моем представлении, где его элементы будут обновляться, как только изменится аргумент списка. Это мой вид:

struct ContentView: View {
@ObservedObject var users = Utenti()
@State private var isSharePresented: Bool = false

var body: some View {
    VStack(spacing: 20) {
        HStack(alignment: .center) {
            Spacer()
            Text("Internal Testers")
                .font(.title)
                .foregroundColor(.primary)
            Spacer()
            Button(action: {
                self.isSharePresented.toggle()
            }) {
                Image(systemName: "square.and.arrow.up").font(.title).padding(.trailing)
            }.sheet(isPresented: self.$isSharePresented, onDismiss: {
                print("Dismissed")
            }, content: {
                ActivityViewController(activityItems: self.users.listaUtenti)
            })
        }
        List(self.users.listaUtenti, id: \.self) { user in
            Text(user)
        }
    }
}

}

List of users in the View

Переменная users является @ObservedObject, поэтому содержимое списка обновляется автоматически, как только он изменится в модели.

Мои вопросы: как мне отловить событие 'update', касающееся переменной users ? И как я могу запустить действие (например, вызвать функцию) после его перехвата?

Ответы [ 2 ]

0 голосов
/ 02 февраля 2020

Предполагая, что listaUtenti является @Published свойством, вы можете поймать его издателя, как показано ниже

List(self.users.listaUtenti, id: \.self) { user in
    Text(user)
}
.onReceive(self.users.$listaUtenti) { newValue in
     // do this what's needed
}
0 голосов
/ 02 февраля 2020
struct Utenti : ObsevableObject {

    @published var listaUtenti = [“anna”, “smith”, “david”]  {
       didSet {

                // your’s func here

         }
}

}

Над кодом, всякий раз, когда изменяется элемент listaUtenti, ваше удовольствие c будет выполняться.

...