SwiftUI - список не обновляется при передаче данных из представления в другое - PullRequest
0 голосов
/ 10 марта 2020

Я пытаюсь отправить данные из FirstView в список в структуре myMoodList. Моя проблема заключается в том, что данные, отправленные в myMoodList, не добавляются в список. Поэтому я добавил фиктивную кнопку в навигационную панель, чтобы добавить строку, содержащую данные.

Вот мой код,

var body: some View {
    NavigationView{
        VStack{
            Text(currentMood)

}
    }.navigationBarItems(trailing: NavigationLink(destination:MyMoodList(currentMood: currentMood)) {
        Text("Next")
    }
    ).navigationBarTitle("Mood People", displayMode: .inline)
}

Итак, currentMood - это строка и ее значение "Happy".

Вот мой основной вид.

struct moodStructure: Identifiable,Decodable {

let id = UUID()
let myMood: String
}

class MoodViewModel: ObservableObject {
@Published var moodStatus = "Test on MoodObjectModel"
@Published var moodArray: [moodStructure] = [
    .init(myMood: "Happy"),
    .init(myMood: "Sad")
]
func addItem(moodStatus: String) {
    moodArray.append(moodStructure(myMood: moodStatus))
    print(moodArray.capacity)
}
func didChange() {
    self.moodStatus = "Test inside did change"
}
}


 struct MyMoodList: View {


@ObservedObject var moodVM = MoodViewModel()
@State var currentMood: String

var body: some View {

    NavigationView {
        List() {
            ForEach(moodVM.moodArray,id: \.myMood) { item in

                HStack {
                    VStack {
                        Text(item.myMood)
                        Text("Feb/3/2020")
                            .font(.callout)
                    }
                    Spacer()
                    Text(">")
                        .fontWeight(.semibold)
                }
            }

        }.navigationBarTitle("Tracker")
            .listStyle(GroupedListStyle())
            .navigationBarItems(trailing: Button(action: {
                self.moodVM.addItem(moodStatus: self.currentMood)
            }) {
                Image(systemName: "plus")
            })
    }
}}

Таким образом, структура MyMoodList имеет навигациюBarButton, я поставил ее просто для того, чтобы убедиться, что данные успешно отправлены из первого просмотра в MyMoodList. но я хочу, чтобы, как только пользователь перешел от firstView к MyMoodList, он автоматически добавился в список. Я не хочу использовать кнопку, чтобы добавить ее в список.

Я не знаю, не обновляется ли список автоматически или список загружается первым, прежде чем элементы были добавлены в moodArray. внутри класса MoodViewModel.

Спасибо.

ОБНОВЛЕНИЕ:

на моем FirstView У меня

.navigationBarItems(trailing: NavigationLink(destination:MyMoodList(currentMood: currentMood, addNewPost: true))

на MyMoodList Class I добавлено @State var addNewPost: Bool

.onAppear() {
        if self.addNewPost == true {
            self.moodVM.addItem(moodStatus: self.currentMood)
            self.addNewPost = false
        } else {
            print("Nothing !!")
        }
    }

1 Ответ

0 голосов
/ 10 марта 2020

Используйте. onAppear модификатор на NavigationView вашей MyMoodList структуры, чтобы добавить строку в массив.

struct ContentView: View {
var currentMood = "Happy1"
var body: some View {
    NavigationView {
        VStack{
            Text(currentMood)

            NavigationLink(destination:MyMoodList(currentMood: currentMood)) {
                Text("Next")
            }
        }
        .navigationBarTitle("Mood People", displayMode: .inline)
    }
}}

struct moodStructure: Identifiable,Decodable {
  let id = UUID()
  let myMood: String
}

class MoodViewModel: ObservableObject {
    @Published var moodStatus = "Test on MoodObjectModel"
    @Published var moodArray: [moodStructure] = [
        .init(myMood: "Happy"),
        .init(myMood: "Sad")
    ]
    func addItem(moodStatus: String) {
        moodArray.append(moodStructure(myMood: moodStatus))
        print(moodArray.capacity)
    }
    func didChange() {
        self.moodStatus = "Test inside did change"
    }
  }

struct MyMoodList: View {

@ObservedObject var moodVM = MoodViewModel()
var currentMood: String

var body: some View {

    NavigationView {
        List() {
            ForEach(moodVM.moodArray,id: \.myMood) { item in

                HStack {
                    VStack {
                        Text(item.myMood)
                        Text("Feb/3/2020")
                            .font(.callout)
                    }
                    Spacer()
                    Text(">")
                        .fontWeight(.semibold)
                }
            }

        }.navigationBarTitle("Tracker")
            .listStyle(GroupedListStyle())
            .navigationBarItems(trailing: Button(action: {
                self.moodVM.addItem(moodStatus: self.currentMood)
            }) {
                Image(systemName: "plus")
            })
    }
    .onAppear {
        if !self.moodVM.contains(self.currentMood) {
        self.moodVM.addItem(moodStatus: self.currentMood)
        }
    }
}}
...