Почему TabView показывает пустой экран, если два вида одинаковы? - PullRequest
5 голосов
/ 22 марта 2020

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

        }
    }
}

1 Ответ

2 голосов
/ 22 марта 2020

Ваш снимок кода не тестируемый, так что просто идея - вы должны проверить его сам.

Итак, предполагая, что ваш объект среды для второго просмотра корректен, попытайтесь сделать его для представлений действительно уникальным, используя модификатор .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")
    }
    ...

Примечание : Я вижу использование .navigationBarHidden(true) в AppView - если это означает, что вы собираетесь включить TabView в NavigationView, тогда не делайте этого - у вас его не будет Работа. TabView разработан для root просмотра только . Если вам нужна навигация, поместите ее внутри вкладок.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...