首页 > 解决方案 > 如何在没有用户输入的情况下在 Swift UI 中切换视图?

问题描述

我想显示一个没有用户输入的视图。

我正在运行 Paul Hudson 的 CodeScanner 包,它在模态(.sheet)视图中扫描 QR 码。

当用户扫描二维码时,模式关闭。

我想有条件地对代码数据采取行动。

如果代码返回符合预期输入的数据,我想将用户带到另一个屏幕。

所有代码当前都在两个 ContentView 之一内。我希望我必须使用 ViewControllers 来完成此操作。我愿意这样做,我已经开始在它自己的 ViewControllerRepresentable 文件中编写目标视图。

我怎么能做到这一点?

谢谢!

编辑

代码:

//Content View
import SwiftUI
import CodeScanner

struct ContentView: View {
  @State private var isShowingScanner = false
  @State var presentingModal = false
  @State var tableId: String = ""

  var body: some View{
    ZStack{
      Color(UIColor(red: 0.04, green: 0.07, blue: 0.27, alpha: 0.80))
        .edgesIgnoringSafeArea(.all)
      VStack{
        Button(action: {
          self.isShowingScanner = true
        }){
          Text("Scan Code")
            .font(.system(size: 30))
            .frame(width: UIScreen.main.bounds.size.width/2, height: 50)
            .padding()
            .background(Color.blue)
            .foregroundColor(Color.white)
            .cornerRadius(5)
        }
        .sheet(isPresented: $isShowingScanner) {
          CodeScannerView(codeTypes: [.qr], simulatedData: "Some simulated data", completion: {(result: Result<String, CodeScannerView.ScanError>) in
            self.isShowingScanner = false
            switch result {
            case .success(let data):
              self.tableId = data
            case .failure(let error):
              print("Scanning failed \(error)")
            }
          })
        }
        Text("Scan a QR code on one of the lounge's tables to begin")
          .font(.system(size: 15))
          .multilineTextAlignment(.center)
          .frame(width: 200)
          .padding()
      }
      .statusBar(hidden: true)
    }
  }
}

struct ContentView_Previews: PreviewProvider {
  static var previews: some View {
    ContentView()
  }
}```

标签: swiftxcodeuikitswiftuiswift5

解决方案


你可以这样做:

只需将我的代码复制到一个新项目并检查它是如何工作的。当然,我必须更改很多代码才能使其运行。您必须对代码进行更改以适应我的解决方案,因为我只是做了一个“简单”的解决方案并且没有采用所有原始参数(例如)。当然,按钮应该被您的二维码阅读所取代……希望这很清楚。

import SwiftUI

struct CodeScannerView : View {

    var completion: (String) -> ()

    var body: some View {

        Button(action: {
            self.completion("just do it")
        }) {
            Text("QR reading simulation")
        }
    }
}

struct NextView : View {

    var body: some View {

        Text("Next View")
    }
}

struct ContentView: View {
    @State private var isShowingScanner = false
    @State var presentingModal = false
    @State var tableId: String = ""
    @State var showNextView = false

    var body: some View{
        NavigationView {
            ZStack{
                Color(UIColor(red: 0.04, green: 0.07, blue: 0.27, alpha: 0.80))
                    .edgesIgnoringSafeArea(.all)
                VStack{
                    NavigationLink("next view", destination: NextView(), isActive: $showNextView).hidden()
                    Button(action: {
                        self.isShowingScanner = true
                    }){
                        Text("Scan Code")
                            .font(.system(size: 30))
                            .frame(width: UIScreen.main.bounds.size.width/2, height: 50)
                            .padding()
                            .background(Color.blue)
                            .foregroundColor(Color.white)
                            .cornerRadius(5)
                    }
                    .sheet(isPresented: $isShowingScanner) {
                        CodeScannerView(completion: { text in
                            if text == "just do it" {
                                self.isShowingScanner.toggle()
                                self.showNextView.toggle()
                            }
                        }
                        )
                    }
                    Text("Scan a QR code on one of the lounge's tables to begin")
                        .font(.system(size: 15))
                        .multilineTextAlignment(.center)
                        .frame(width: 200)
                        .padding()
                }
                .statusBar(hidden: true)
            }
        }
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

推荐阅读