【问题标题】:how to prevent other views refreshing in state change swiftUI如何防止在状态更改swiftUI中刷新其他视图
【发布时间】:2020-09-03 05:39:54
【问题描述】:

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

主视图

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

MainViewModel

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

MeMainView

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

struct MeMainView: View {
@ObservedObject var mainViewModel:MainViewModel


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

【问题讨论】:

    标签: swift xcode swiftui combine


    【解决方案1】:

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

    【讨论】:

    • 感谢您的回答。但仍然刷新视图结构 MainView: View { @ObservedObject var viewModel = MainViewModel() var body: some View { ZStack { MainContentView(viewModel: viewModel) VStack { Spacer() BottomNavigationView(mainViewModel: self.viewModel) .padding(.水平) }.opacity(viewModel.isBottomNavigationVisible ? 1 : 0) } } }
    • MainView 的主体会一直刷新,因为它依赖于修改后的viewModel.isBottomNavigationVisible。这个想法是将其他部分分成不会刷新的子视图。
    【解决方案2】:
    var  myDict: [String: Double] = [:]
    
    var body: some View {
          
                        HStack(alignment: .top) {
                            Button(action: {
                               self.myDict[self.tag] = amountValue
    
                            })
                      }
    

    当我选择第一个用户并将一些值保存到 myDict 时,我有两个用户,我想在选择第二个用户时将第二个用户的值添加到 MyDict(意味着 MyDict 的计数应该是 2)但是当我选择第二个用户视图时正在刷新,第一个用户的值被第二个用户替换(意味着 MyDict 的计数应该是 1)。

    有什么办法可以让我同时拥有 dict 中的值而不刷新?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-06-15
      • 2019-12-17
      • 2020-05-23
      • 1970-01-01
      • 1970-01-01
      • 2021-01-17
      • 2021-07-08
      相关资源
      最近更新 更多