Swift UI и данные объекта ObservableObject очищены - PullRequest
2 голосов
/ 04 марта 2020

Я немного новичок в SWIFT и сейчас сталкиваюсь с проблемой с пользовательским интерфейсом. Позвольте мне попытаться объяснить мою проблему.

Данные моего домашнего экрана поступают из веб-службы с использованием объекта Observable, и он загружает данные в первый раз. Но когда я пытался открыть свои левые боковые слайд-меню, тогда данные homeservice / obervable object homeView просто очищаются при открытии левого слайд-меню. Почему данные моего наблюдаемого объекта пусты. Позвольте мне поделиться своим кодом:

1 .------ Это мой основной / 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 .----- Это мое представление RouteChanger для навигации на разные страницы моих просмотров.

struct RouteChanger: View {

    @EnvironmentObject var viewRouter: ViewRouter

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

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

                    HomeView()

                    //.modifier(PageSwitchModifier())
                }

            }
        }
    }
}

3 .... Это мой homeView, где я использую Observable 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 Ответ

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

EnvironmentObject автоматически добавляется для всех подпредставлений, поэтому соответствующая часть вашего ContentView должна выглядеть следующим образом

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