SwiftUI вернуться программно из представимого в View - PullRequest
0 голосов
/ 16 октября 2019

Я пытаюсь настроить Qr Reader в новом приложении Swift UI.

Я могу загрузить представление UIKit Qr Reader с помощью этой строки

NavigationLink(destination: QRCodeScan()){Text("Scan QR")}

Это мой ViewControllerRepresentable

struct QRCodeScan: UIViewControllerRepresentable {

func makeCoordinator() -> Coordinator {
    Coordinator(self)
}

func makeUIViewController(context: Context) -> ScannerViewController {
    let vc = ScannerViewController()
    vc.delegate = context.coordinator
    return vc
}

func updateUIViewController(_ vc: ScannerViewController, context: Context) {
}

class Coordinator: NSObject, QRCodeScannerDelegate {
    func codeDidFind(_ code: String) {
        print(code)
        //Go back to the last page, take 'code' with you
    }

    var parent: QRCodeScan

    init(_ parent: QRCodeScan) {
        self.parent = parent
    }
}

}

В строке «Вернуться на последнюю страницу ...» мне нужно программно вернуться на страницу, которая отправила пользователя насканер qr. Страница загружается с кнопкой навигации назад, мне в значительной степени нужно повторить поведение этих кнопок для вызова, когда мне нужно

Любая помощь / указатели оценены

tia

Ответы [ 2 ]

1 голос
/ 16 октября 2019
struct ContentView: View {
    @State var isActive = false
    @State var code = ""
    var body: some View {
        NavigationView {
            ZStack {
                NavigationLink(destination: DetailView(isActive: $isActive, code: $code), isActive: $isActive, label: { EmptyView() })
                Button(action: {
                    self.isActive.toggle()
                }, label: {
                    Text("navigate")
                })
            }
        }
    }
}
struct DetailView: View {

    @Binding var isActive: Bool
    @Binding var code: String

    var body: some View {
        Button(action: {
            self.code = "new code"
            self.isActive.toggle()
        }) {
            Text("Back")
        }
    }
}

Это может помочь вам, используйте параметр isActive NavigationLink для перемещения вперед и назад

0 голосов
/ 16 октября 2019

Краткий ответ: вы не можете сделать это прямо сейчас. Нет ни привязки, ни значения окружения, которое можно было бы установить, которое может вызвать это. Я предполагаю, что будет какое-то значение среды, похожее на 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, которая на самом деле должна работать для вас, если вы все еще хотите поместить свое представление в стек навигации вместо представления его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...