SwiftUI: выход из системы и переключение экранов из всплывающего окна

В моем приложении у меня есть представление, которое настроено либо на представление входа в систему, либо на домашнюю вкладку TabView, в зависимости от того, вошел ли пользователь в систему. Из TabView пользователь может перейти к всплывающему профилю и выйти из системы. Я хочу вернуться к просмотру входа в систему из этого всплывающего окна.

Я попытался отклонить всплывающее окно и немедленно выйти из системы, но когда я тестирую на реальном устройстве, всплывающее окно остается на экране, а также больше не реагирует на ввод пользователя. Это не может быть отклонено. Я не уверен, почему, и что мне делать вместо этого?

Начальный вид:

      struct StartView: View {
    @EnvironmentObject var authService:AuthService
    
    var body: some View {
        ZStack {
            if(!authService.signedIn) {
                LoginView()
            } else {
                HomeView()
            }
        }
    }
}

Домашняя вкладка:

      import SwiftUI

struct HomeView: View {
    @State private var showingProfilePopover:Bool = false
    
    var body: some View {
        TabView {
            NavigationView {
                VStack(alignment: .leading) {
                    Text("Tab 1")
                    .padding(.leading, 30)
                }
                .toolbar {
                    ToolbarItem {
                        Button(action: {
                            showingProfilePopover = true
                            }, label: {
                                Image(systemName: "person.crop.circle").imageScale(.large)
                            }
                        )
                    }
                }
                
            }.popover(isPresented: $showingProfilePopover) {
                ProfileView(isPresented: $showingProfilePopover)
            }
            .tabItem {
                Image(systemName: "list.bullet")
                    .font(.system(size: 26))
                Text("Tab 1")
            }
            
            
            
            NavigationView {
                VStack(alignment: .leading) {
                    Text("Tab 2")
                }
            }.tabItem {
                Image(systemName: "books.vertical")
                    .font(.system(size: 26))
                Text("Tab 2")
            }
        }
        
    }
}

Трещать:

      struct ProfileView: View {
    @EnvironmentObject var authService:AuthService
    @Binding var isPresented: Bool
    
    var body: some View {
        Button("Logout") {
            // Close the popup and switch to LoginView
            print("Tapped logout")
            isPresented = false
            
            authService.signOut()
        }
        .font(Font.custom("OpenSans-Regular", size: 18))
            .padding(20)
    }
}

ЛогинВид:

      import SwiftUI

struct LoginView: View {
    @EnvironmentObject var authService:AuthService
    
    var body: some View {
        VStack {
            Button("Login") {
                self.authService.signIn()
            }.buttonStyle(.borderedProminent)
        }
    }
}

Служба авторизации:

      import SwiftUI

class AuthService: ObservableObject {
    @Published var signedIn:Bool
    
    init(signedIn:Bool) {
        self.signedIn = signedIn
    }
    
    func signIn() {
        self.signedIn = true
    }
    
    func signOut(){
        self.signedIn = false
    }
}

2 ответа

Похоже проблема связана с . Я могу воспроизвести проблему, но она отлично работает, используя.sheetвместо.

Рассмотрите возможность присоединения.popoverнаTabViewилиButtonсам то, кажется, работает просто отлично.

Я понял, что проблема возникает только в более старых версиях iOS. он отлично работает на iOS 15, но не на iOS 14 и ниже iOS 14.

      @main
struct LoginApp: App {
    let authService: AuthService
    
    init() {
        authService = AuthService(signedIn: false)
    }
    
    var body: some Scene {
        WindowGroup {
            StartView().environmentObject(authService)
        }
    }
}

Это iPhone 8, iOS 14.

Другие вопросы по тегам