Краткий ответ: вы не можете сделать это прямо сейчас. Нет ни привязки, ни значения окружения, которое можно было бы установить, которое может вызвать это. Я предполагаю, что будет какое-то значение среды, похожее на presentationMode
, которое вы можете использовать, но в настоящее время оно не рекламируется.
Вы можете попробовать текущий presentationMode
, но мое реальное предложение - представить ваш QR-сканер в виде листа, а не толчка. В любом случае это может иметь больше смысла с навигационной точки зрения. Чтобы сделать это таким образом, в вашем докладчике установите переменную @State
для обработки, когда она будет представлена.
@State var presentQRScanner = false
var body: some View {
Button("Scan") {
self.presentQRScanner = true
}
.sheet(isPresented: $presentQRScanner) { QRCodeScan() }
}
Затем, когда вы захотите программно отклонить, ваш UIViewControllerRepresentable
:
@Environment(\.presentationMode) var presentationMode: Binding<PresentationMode>
func scannedCode() {
presentationMode.wrappedValue.dismiss()
}
В качестве альтернативы, вы также можете управлять этим от докладчика, создав закрытие на QRCodeScan, которое вызывается с кодом, и ваш докладчик отклоняется.
var onCodeScanned: (Code) -> Void = { _ in }
func scannedCode() {
onCodeScanned(code)
}
и в докладчике:
var body: some View {
Button("Scan") {
self.presentQRScanner = true
}
.sheet(isPresented: $presentQRScanner) {
QRCodeScan(onCodeScanned: {
self.process($0)
self.presentQRScanner = false
})
}
}
РЕДАКТИРОВАТЬ: не знал о привязке isActive
, которая на самом деле должна работать для вас, если вы все еще хотите поместить свое представление в стек навигации вместо представления его.