【问题标题】:Swift UI and ObservableObject Object Data Cleared清除 Swift UI 和 ObservableObject 对象数据
【发布时间】:2020-03-04 12:05:48
【问题描述】:

我是 SWIFT 的初学者,现在我遇到了 UI 问题。让我试着解释我的问题。

我的 homeview 屏幕数据来自使用 Observable 对象的 Web 服务,它会第一次加载数据。但是,当我尝试打开左侧幻灯片菜单时,打开左侧幻灯片菜单视图时,homeView 网络服务/可观察对象数据只是被清除。为什么我的可观察对象数据为空。让我分享我的代码:

1.----- 这是我的主视图/父视图

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....这是我使用 Observable Object 的 homeView

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)
                    }
                }
            }
        }
    }
}

【问题讨论】:

    标签: ios swift observable swiftui


    【解决方案1】:

    EnvironmentObject 会自动为所有子视图注入,因此您的 ContentView 的相关部分应如下所示

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

    【讨论】:

    • 谢谢...但是当我删除 '''EnvironObject''' 时,如何在不注入的情况下访问它的属性?
    • @MuhammadIshaq,你把@EnvironmentObject var viewRouter: ViewRouter声明在RouteChangerMainMenuView中,它会被ContentView自动注入。所以你会像现在一样使用它。
    • 好的,知道为什么我的 Observable 对象数据在打开侧边菜单时会清除。
    • @MuhammadIshaq,您是否进行了上述更改并且数据清晰?
    • 哇,伙计....通过实施您的建议,现在解决了这个问题..
    猜你喜欢
    • 1970-01-01
    • 2023-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-27
    • 2021-11-03
    • 1970-01-01
    相关资源
    最近更新 更多