swift - 如何防止在状态更改swiftUI中刷新其他视图
问题描述
我的主视图中有一个底部导航视图,我想通过@published
ViewModel 中定义的变量将其隐藏在一些内部视图中,但是当我更改变量的值时,主视图中的所有主体都会刷新并导致一些问题(丢失数据)。我只想刷新底部导航的状态,而不是整个身体。这是我的代码:
主视图
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()
}
}}
解决方案
而不是可计算属性移动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()
}
}
推荐阅读
- swift - Swift - BLE 扫描仪响应
- php - 匹配具有任何扩展名或没有扩展名的文件的 glob 语法
- angular - Angular 8 测试服务路由
- python - 如何将 PyInstaller 与 distutils 一起使用
- javascript - Indesign 标注尺寸
- applescript - 使用苹果脚本重命名目录子文件夹中具有相同扩展名的所有文件?
- javascript - 替代 Angular 模板中的函数
- sql - 从 3 个不同的表中查询
- powershell - PS 脚本在第一个 else 语句后停止
- reactjs - 在导致 404 的路由内部刷新