SwiftUI, имеющий @Environment(.presentationMode) для отклонения неправильного поведения представления

#ios #xcode #swiftui #swiftui-environment

Вопрос:

У меня есть представление @Environment(.presentationMode) var presentationMode: Binding<PresentationMode> для пользовательского действия «отклонить», основанного на опубликованном значении, в соответствии с некоторой логикой, подобной этой:

 .onAppear(perform: {
            viewModel.cancellable = viewModel.$shouldPopBack.sink(receiveValue: { shouldPopBackToHome in
                if shouldPopBackToHome {
                    presentationMode.wrappedValue.dismiss()
                }
            })
        })
 

В этом представлении также есть еще один вариант представления листа

 Button(action: {
            shouldNavigateToQRCodeScanner = true
        }, label: {
            Text("Scan QR code")
                .padding(.horizontal)
        }).sheet(isPresented: $shouldNavigateToQRCodeScanner, content: {
            QRCodeScannerView()
        })
 

Проблема здесь в том, что когда у меня @Environment(.presentationMode) QRCodeScannerView есть инициализация дважды, когда я удаляю режим представления, он работает нормально.


Обновление Я пробовал то же самое поведение в тестовом проекте, и это то же самое

 struct ContentView: View {

@Environment(.presentationMode) var presentationMode: Binding<PresentationMode>
@State var isPresentd: Bool = false

var body: some View {
    NavigationView {
        Button(action: {
            isPresentd = true
        }, label: {
            Text("Navigate to Second View")
        })
        .sheet(isPresented: $isPresentd, content: {
                SecondView()
            })
    }
}

}
struct SecondView: View {

init() {
    print("Initialized")
}

var body: some View {
    Text("Second View")
}
}
 

У него та же проблема

Скриншот

Комментарии:

1. Представление SwiftUI-это значение, оно может быть создано много раз механизмом рендеринга SwiftUI, оно не находится под нашим контролем (в большинстве случаев). Так что просто не полагайтесь на это.

2. Проблема в том, что он деинфицирует модель представления, и она больше не содержит никаких данных