Сбрасывается presentationMode (@Environment) при изменении ObservableObject
Проект на IOS 15
У меня есть Loading ObservableObject:
class Loading: ObservableObject {
@Published var isLoading: Bool = false
}
Также у меня есть ContentView, в котором находятся все View и где располагается мой load (loader который показывается поверх всех view).
struct ContentView: View {
@StateObject private var loading = Loading()
@State private var rotationAngle = 0.0
@EnvironmentObject var tabBarState: TabBarState
@ObservedObject private var keyboard = KeyboardResponder()
@State var selectedTab: Tab = .home
@State var selectedItem: CategoryModel? = nil
init(windowScene: UIWindowScene?) {
UITabBar.appearance().isHidden = true
}
var body: some View {
ZStack {
VStack(spacing: 0) {
TabView(selection: $selectedTab) {
ForEach(Tab.allCases, id: \.rawValue) { tab in
switch selectedTab {
case .home:
HomeView()
case .catalog:
CatalogView()
case .newProduct:
NewProductView()
case .message:
MessageView()
case .profile:
RegistrationVariantsView()
}
}
}
CustomTabBar(selectedTab: $selectedTab)
.frame(height: keyboard.keyboardHeight != 0 ? 0 : .infinity)
.clipped()
.animation(.easeInOut, value: keyboard.keyboardHeight)
}
if loading.isLoading {
load
}
}
.environmentObject(loading)
}
}
extension ContentView {
private var load: some View {
ZStack {
Color.red.opacity(0.3)
.frame(maxHeight: .infinity)
.edgesIgnoringSafeArea(.all)
Image("preloader")
.resizable()
.scaledToFit()
.frame(width: 28, height: 28)
}
.zIndex(50)
}
}
Проблема заключается в том, что когда я переключился на окно PromotionOneView через NavigationLink и там изменяю isLoading на true, то в таком случае isLoading действительно становится true и показывается, но в этот же момент сбрасывается presentationMode и меня перекидывает на главный экран
struct PromotionOneView: View {
@Environment(\.presentationMode) var presentationMode
@EnvironmentObject var loader: Loading
var body: some View {
VStack(spacing: 0) {
ScrollView(showsIndicators: false) {
Text("Test")
}
.frame(maxHeight: .infinity, alignment: .top)
}
.background(Color("greyBG"))
.navigationBarBackButtonHidden(true)
.navigationBarTitleDisplayMode(.inline)
.navigationBarHidden(true)
.toolbar {
ToolbarItemGroup(placement: .keyboard) {
Spacer()
Button("Готово") {
DispatchQueue.main.async {
UIApplication.shared.endEditing()
}
}
}
}
.safeAreaInset(edge: .bottom, spacing: 0) {
VStack(spacing: 8) {
Button(action: {
loader.isLoading = true
}) {
Text("Поднять объявление")
.frame(maxWidth: .infinity)
.font(Font.custom("Manrope", size: 16).weight(.bold))
.foregroundColor(.white)
.padding(.horizontal, 10)
.padding(.vertical, 18)
}
.background(Color("green"))
.cornerRadius(8)
}
.padding(.horizontal, 10)
.padding(.vertical, 10)
}
}
}
Попробовал использовать свой модификатор, который будет поверх всего, но из-за того что он будет находится внутри TabView, то CustomTabBar не получится перекрыть