Почему onAppear снова вызывается после onDisappear при переключении вкладки в TabView в SwiftUI? - PullRequest
3 голосов
/ 04 августа 2020

Я вызываю API при появлении элемента вкладки, если есть какие-то изменения. Почему onAppear вызывается после вызова onDisappear?

Вот простой пример:

struct ContentView: View {
    var body: some View {
        TabView {
            NavigationView {
                Text("Home")
                    .navigationTitle("Home")
                    .onAppear {
                        print("Home appeared")
                    }
                    .onDisappear {
                        print("Home disappeared")
                    }
            }
            .tabItem {
                Image(systemName: "house")
                Text("Home")
            }.tag(0)
        
            NavigationView {
                Text("Account")
                    .navigationTitle("Account")
                    .onAppear {
                        print("Account appeared")
                    }
                    .onDisappear {
                        print("Account disappeared")
                    }
            }
            .tabItem {
                Image(systemName: "gear")
                Text("Account")
            }.tag(1)
        }
    }
}    

Просто запустите приведенный выше код, и мы увидим onAppear после onDisappear.

Home appeared
---After switch tab to Account---
Home disappeared
Account appeared
Home appeared

Is есть ли какое-нибудь решение, чтобы этого избежать?

1 Ответ

1 голос
/ 21 августа 2020

Я не уверен, почему вы наблюдаете такое поведение в своем приложении. Но я могу объяснить, почему я видел это в своем приложении.

У меня была очень похожая настройка, и я наблюдал такое же поведение при запуске приложения iOS13 в бета-версии iOS14. На моем домашнем экране у меня была настраиваемая панель вкладок, которая анимировалась, когда отображался подробный экран. Код для запуска скрытия панели вкладок был выполнен в .onAppear экрана сведений. Это приводило к перерисовке главного экрана и вызову .onAppear. Я удалил анимацию и обнаружил, что настройка намного лучше из-за этой ошибки, и главный экран .onAppear перестал вызываться.

Итак, если у вас есть что-то на экране вашей учетной записи .onAppear, что визуально влияет на главную Затем попробуйте закомментировать экран и посмотреть, решит ли он проблему.

Удачи.

...