1

I have a NavigationView on my app. From mainView I open with NavigationLink MessagesView and from inside MessagesView I open with NavigationView ChatView. On ChatView i've made a backButton, but when I press the backButton I don't know how to make MessagesView to reload.

I've searched for solution online, but either are not working, or I don't understand them.

This is the code that I have so far:

struct MessagesView: View {

@ObservedObject var allMessages = GetAllMessages()
@State var readNewThreadMessages = [MessagesDetailes]()
//astea sunt puse pentru a scapa de bugul ca nu iti incarca cateodata View
@ObservedObject var observer = Observer()
@Binding var incepemOnReceive : Bool

var body: some View {
    ScrollView(.vertical, showsIndicators: false) {
        if allMessages.readThreadMessages.count == 0 {
            LoadingView()
                .padding(.top, 50)
        } else {
            
            //mesajele din DB
            ForEach(allMessages.readThreadMessages) { message in
                NavigationLink(destination: ChatView(incepemOnReceive: $incepemOnReceive, other_name: message.other_user, other_object: message.other_object, produs_nume: message.product_name, produs_pret: message.product_price, produs_id: message.product_id, thread_obj: message.threadObj, readThreadMessages: $allMessages.readThreadMessages).onAppear(perform: {
                    self.allMessages.markMessageAsSeen(obiect: message.readStateObj, isRead: message.seen)
                })) {
                    MessagesRow(message: message)
                        .background(message.seen ? Color.clear : Color("ColorSecondary").opacity(0.1))
                }
            }
        }
    }
    .onReceive(self.observer.$enteredForeground){ _ in
        if self.incepemOnReceive {
            self.allMessages.readAllMessages()
            print("read from db")
        }
    }
    .onAppear(perform: {
        self.incepemOnReceive = true
    })
    .navigationTitle(LocalizedStringKey("MessagespNavT"))
    .navigationBarTitleDisplayMode(.inline)
}}

And ChatView with backButton

struct ChatView: View {
    @Environment(\.presentationMode) var presentationMode
    @ObservedObject var getChatMessages = GetChatMessages()
    @Binding var incepemOnReceive : Bool
    
    var other_name   : String
    var other_object : PFObject
    var produs_nume  : String
    var produs_pret  : String
    var produs_id    : String
    var thread_obj   : PFObject
    @State var writeMessage = ""
    @State var messageArray = [CurrentChatMessages]()
    @State var showFromDB = true
    
    @Binding var readThreadMessages : [MessagesDetailes]
    @State var size : CGFloat = 35
    //photo picker
    @State var isPresented: Bool = false
    @State var pickerResult: [UIImage] = []
    var config: PHPickerConfiguration {
        var config = PHPickerConfiguration(photoLibrary: PHPhotoLibrary.shared())
        config.filter = .images //videos
        config.selectionLimit = 1
        return config
    }
    
    var body: some View {
        
        VStack{
            // show chat
            
        }.onAppear(perform: {
            self.incepemOnReceive = false
            UITextView.appearance().backgroundColor = UIColor(.gray).withAlphaComponent(0.15)
            self.getChatMessages.getAllChatMessages(threadObj: thread_obj)
            
        })
        .navigationBarItems(leading:
                                Button(action: {
                                    for mesaj in 0..<readThreadMessages.count-1 {
                                        if readThreadMessages[mesaj].threadObj == thread_obj {
                                            readThreadMessages[mesaj].seen = true
                                        }
                                    }
                                    self.incepemOnReceive = true
                                    self.presentationMode.wrappedValue.dismiss()
                                }) {
                                    CustomBackButton()
                                })
    }
}
Silviu
  • 145
  • 2
  • 10
  • You have to force your ViewModel to update. This answer may help you https://stackoverflow.com/a/59873443/13859627 – novol Feb 24 '21 at 15:01

2 Answers2

0

I've rezoved the isue.

I've deleted

@ObservedObject var observer = Observer()
@Binding var incepemOnReceive : Bool
 .onReceive(self.observer.$enteredForeground){ _ in ...}

I've added @State var messagesSelected = 0

And on MessagesView i've put:

.onAppear(perform: {
            if messagesSelected == 0 {
                self.allMessages.readAllMessages()
                print("ASDASDASDASDASDASDASDASDASDASDASDASDASDASDASDASDASDASD")
            }
        })
Silviu
  • 145
  • 2
  • 10
0

to make your MessagesView reload, you can add this inside onAppear

self.allMessages.objectWillChange.send()

this should be enough to make your view reload each time it appears, and you can make it inside a condition if you want to, i don't think that your solution is the best way to do it.

Mostfa Essam
  • 745
  • 8
  • 11