Swift UI and ObservableObject Object Data Cleared

Viewed 233

I'm a bit beginner in SWIFT and right now I'm facing a problem whit UI. Let me try to explain my problem.

my homeview screen data coming from web service using Observable object and it loads the data first time. But when I tried to open my left side slide menus than homeView webservice/obervable object data is just cleared when open the left slide menu view. Why my observable object data is empty. Let me share my code:

1.------ This is a my main/parentView

struct ContentView: View {

    @EnvironmentObject var viewRouter: ViewRouter

    var body: some View {

        let drag = DragGesture()
            .onEnded {
                if $0.translation.width < -100 {
                    withAnimation {
                        self.viewRouter.showSlideOutMenu = false
                        self.viewRouter.showDepartmentsMenu = false
                        self.viewRouter.showAccountMenu = false
                    }
                }
        }

        return GeometryReader { g in
            ZStack(alignment: .leading) {
                RouteChanger(viewRouter: self._viewRouter)
                if self.viewRouter.showSlideOutMenu {
                    MainMenuView(viewRouter: self._viewRouter)
                        .frame(width: g.size.width/2)
                        .transition(.move(edge: .leading))
                }
            }
            .gesture(drag)
        }
    }
}

2.----- This is my RouteChanger view for navigate to different pages of my views.

struct RouteChanger: View {

    @EnvironmentObject var viewRouter: ViewRouter

    var body: some View {
        GeometryReader { g in
            VStack {

                if self.viewRouter.currentPage == "Home" {

                    HomeView()

                    //.modifier(PageSwitchModifier())
                }

            }
        }
    }
}

3.... This is my homeView where I am using Observeable Object

struct HomeView: View {

    @ObservedObject var homeController =  HomeController()

    var body: some View {

        GeometryReader { g in
            ZStack {
                Color(UIColor.midTown.blue)
                    .edgesIgnoringSafeArea(.top)

                VStack { //whole body

                    if self.homeController.homePageData.CODE == "0" {
                        ImageViewWidget(imageUrl:  (self.homeController.homePageData.DATA?.headerList[0].img_url)!)
                            .frame(minWidth: g.size.width, maxWidth: g.size.width, minHeight: (g.size.width * UIImage(named: "header")!.size.height) / UIImage(named: "header")!.size.width, maxHeight: (g.size.width * UIImage(named: "header")!.size.height) / UIImage(named: "header")!.size.width)
                    }
                    else {
                        Text("Loading...")
                            .foregroundColor(Color.blue)
                            .padding()
                            .frame(width: g.size.width)
                    }
                }
            }
        }
    }
}
1 Answers

The EnvironmentObject is injected for all subviews automatically, so related part of your ContentView should look like below

 ZStack(alignment: .leading) {
    RouteChanger()                               // << here
    if self.viewRouter.showSlideOutMenu {
        MainMenuView()                           // << here
             .frame(width: g.size.width/2)
             .transition(.move(edge: .leading))
     }
Related