首页 > 解决方案 > 如何防止在状态更改swiftUI中刷新其他视图

问题描述

我的主视图中有一个底部导航视图,我想通过@publishedViewModel 中定义的变量将其隐藏在一些内部视图中,但是当我更改变量的值时,主视图中的所有主体都会刷新并导致一些问题(丢失数据)。我只想刷新底部导航的状态,而不是整个身体。这是我的代码:

主视图

struct MainView: View {
@ObservedObject var viewModel = MainViewModel()


var body: some View {
    ZStack {
        VStack{
            content
        }
        
            VStack {
                Spacer()
                BottomNavigationView(mainViewModel: self.viewModel)
                        .padding(.horizontal)
            }.opacity(viewModel.isBottomNavigationVisible ? 1 : 0)


    }
}

var content: some View {
    switch self.viewModel.currentView {
    case .plan:
        return PlanMainView(mainViewModel: viewModel).eraseToAnyView()
    case .me:
        return MeMainView(mainViewModel: viewModel).eraseToAnyView()
    case .onBoarding:
        return OnBoardingHome(mainViewModel: viewModel).eraseToAnyView()
}}

主视图模型

class MainViewModel: ObservableObject {
@Published private(set) var currentView: Modules = .main
@Published var isBottomNavigationVisible: Bool = true


func hideBottomBar() {
    self.isBottomNavigationVisible = false
}

func showBottomBar() {
    self.isBottomNavigationVisible = true
}

func GoToView(view: Modules) {
    self.currentView = view
}}

我的主视图

这是我想在 onAppear 中隐藏底部导航的视图

struct MeMainView: View {
@ObservedObject var mainViewModel:MainViewModel


var body: some View {
    ZStack {
       Text("MewView")
    }.onAppear{
        self.mainViewModel.hideBottomBar()
    }
}}

标签: swiftxcodeswiftuicombine

解决方案


而不是可计算属性移动content到单独的视图中,因为它没有任何改变,所以它不会被刷新

    VStack{
        BodyView(viewModel: viewModel)
    }

struct BodyView: View {
   @ObservedObject var viewModel: MainViewModel

   var body: some View {
      switch self.viewModel.currentView {
      case .plan:
        return PlanMainView(mainViewModel: viewModel).eraseToAnyView()
      case .me:
        return MeMainView(mainViewModel: viewModel).eraseToAnyView()
      case .onBoarding:
        return OnBoardingHome(mainViewModel: viewModel).eraseToAnyView()
  }
}

推荐阅读