我的应用程序中有一个 TabView,用于显示四个屏幕。两者相似但具有不同的数据源。如果我单击第一个选项卡 (EventsScreen),然后单击第三个选项卡 (MyBagScreen),则一切正常。如果我单击第一个选项卡 (EventsScreen),然后单击第二个选项卡 (EventsScreen),它只会加载一个空白屏幕(我认为它只是加载背景)。它们是两个不同的对象,为什么这不起作用?
AppView.swift
struct AppView: View {
var body: some View {
TabView {
EventsScreen().environmentObject(EventsViewModel(repo: IncentivesRespository()))
.tabItem {
Text("Barter")
Image("icon_barter")
}
EventsScreen().environmentObject(EventsViewModel(repo: OpportunityRepository()))
.tabItem {
Text("Earn")
Image("icon_earn")
}
MyBagScreen().environmentObject(MyBagViewModel())
.tabItem{
Text("My Bag")
Image("icon_bag")
}
AccountScreen().environmentObject(AccountViewModel())
.tabItem {
Text("Account")
Image("icon_account")
}
}
.onAppear(perform: {
UITabBar.appearance().backgroundColor = .black
})
.navigationBarHidden(true)
}
}
Run Code Online (Sandbox Code Playgroud)
事件屏幕
struct EventsScreen: View {
@EnvironmentObject
var viewModel: EventsViewModel
let calendarManager = RKManager(calendar: Calendar.current, minimumDate: Date(), maximumDate: Date().addingTimeInterval(60*60*24*90), mode: 1)
@State
var currentPage: Int = 0
@State
private var searchTerm : String = ""
init() {
UITableView.appearance().separatorStyle = .none
}
var body: some View {
GeometryReader { geometry in
List {
ZStack(alignment: .top) {
EventViewController(controllers: self.viewModel.featureEventControllers, currentPage: self.$currentPage)
VStack {
SearchBar(text: self.$searchTerm)
.padding(EdgeInsets.init(top: 16, leading: 16, bottom: 0, trailing: 16))
HStack {
Spacer()
Chip(text: "Dates", action: {
self.viewModel.showDateSelection.toggle()
})
.sheet(isPresented: self.$viewModel.showDateSelection, onDismiss: {
self.viewModel.onDatesSelected(startDate: self.calendarManager.startDate, endDate: self.calendarManager.endDate)
}, content: {
RKViewController(isPresented: self.$viewModel.showDateSelection, rkManager: self.calendarManager)
})
Chip(text:"Type", action: {
self.viewModel.showTypeSelection.toggle()
})
Chip(text: "Points", action: {
self.viewModel.showPointsSelection.toggle()
})
Spacer()
}
}
}.listRowInsets(EdgeInsets())
.frame(height: 600)
ForEach(self.viewModel.eventSections.indices) { id in
EventSectionView(eventSection: self.viewModel.eventSections[id])
}
.listRowBackground(Color.black)
}
.navigationBarTitle(Text("Events"), displayMode: .inline)
.navigationBarHidden(true)
if self.viewModel.showPointsSelection {
EventsPointsRangeBottomSheet(isOpen: self.$viewModel.showPointsSelection, selectedRange: self.$viewModel.selectedRange, range: 0.0...self.viewModel.maxPoints, action: {
self.viewModel.onPointsSelected()
})
}
if self.viewModel.showTypeSelection {
TypeBottomSheet(categories: self.viewModel.allCategories, isOpen: self.$viewModel.showTypeSelection, selectedCategoryUuids: self.$viewModel.selectedCategoryUuids, action: {
self.viewModel.onTypesSelected()
})
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
你的代码快照是不可测试的,所以只是一个想法 - 你必须测试它本身。
因此,假设第二个视图的环境对象是正确的,请尝试使用.id修饰符使这些视图真正唯一,如下所示
TabView {
EventsScreen().environmentObject(EventsViewModel(repo: IncentivesRespository()))
.id(1) // << here !!
.tabItem {
Text("Barter")
Image("icon_barter")
}
EventsScreen().environmentObject(EventsViewModel(repo: OpportunityRepository()))
.id(2) // << here !!
.tabItem {
Text("Earn")
Image("icon_earn")
}
...
Run Code Online (Sandbox Code Playgroud)
注意:我看到了.navigationBarHidden(true)in 的用法AppView- 如果这意味着你要包含TabView到 中NavigationView,那么就不要这样做- 你不会让它工作。TabView 被设计为仅作为根视图。如果您需要导航,请将其放在选项卡内。
| 归档时间: |
|
| 查看次数: |
455 次 |
| 最近记录: |