swift - 如何在没有用户输入的情况下在 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()
}
}```
解决方案
你可以这样做:
只需将我的代码复制到一个新项目并检查它是如何工作的。当然,我必须更改很多代码才能使其运行。您必须对代码进行更改以适应我的解决方案,因为我只是做了一个“简单”的解决方案并且没有采用所有原始参数(例如)。当然,按钮应该被您的二维码阅读所取代……希望这很清楚。
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()
}
}
推荐阅读
- apache-superset - 在 docker 模式下运行时如何应用超集迁移?
- duplicates - 当端点位于负载均衡器之后时避免重复数据删除
- java - 如何将多个片段数据获取到单个活动中
- google-chrome - 寻找更新 Chromedriver 选项的方法
- react-router - Ionic Route 替换 Url 没有页面动画
- html - pdf下载文件不响应CSS
- socket.io - 有没有办法通过socket.io向客户端发送图像?
- excel - excel中不同数据的累积百分比
- php - FollowSymLinks 不适用于 laravel 8
- python - 在透视后删除更高级别的索引名称