В моем приложении есть 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)
}
}
EventsScreen
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()
})
}
}
}
}