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.