Я пытаюсь сделать приложение для сканера штрих-кода. Я хочу, чтобы сканер загружался при первом запуске приложения, как фон. Затем, когда штрих-код будет отсканирован, загрузите вид сверху, отображающий продукт.
В моем ContentsView () я загружаю это представление, которое запускает сканер, а затем переходит к FoundItemSheet (), когда штрих-код был найден.
import Foundation
import SwiftUI
import CodeScanner
struct barcodeScannerView: View {
@State var isPresentingScanner = false
@State var scannedCode: String?
@State private var isShowingScanner = false
var body: some View {
NavigationView {
if self.scannedCode != nil {
NavigationLink("Next page", destination: FoundItemSheet(scannedCode: scannedCode!), isActive: .constant(true)).hidden()
}
}
.onAppear(perform: {
self.isPresentingScanner = true
})
.sheet(isPresented: $isShowingScanner) {
self.scannerSheet
}
}
var scannerSheet : some View {
CodeScannerView(
codeTypes: [.qr],
completion: { result in
if case let .success(code) = result {
self.scannedCode = code
self.isPresentingScanner = false
}
}
)
}
}
Когда вид навигации заменяется кнопкой, например:
VStack(spacing: 10) {
if self.scannedCode != nil {
NavigationLink("Next page", destination: FoundItemSheet(scannedCode: scannedCode!), isActive: .constant(true)).hidden()
}
Button("Scan Code") {
self.isPresentingScanner = true
}
.sheet(isPresented: $isPresentingScanner) {
self.scannerSheet
}
Text("Scan a QR code to begin")
Он работает с этим решением, но я хочу, чтобы сканер показывал, когда приложение загружается, а не включено нажатие кнопки. Я попытался заменить кнопку на .onAppear с тем же содержимым, что и кнопка, но это не сработало.
This is foundItemSheet ()
struct FoundItemSheet: View {
@State private var bottomSheetShown = false
@State var scannedCode: String?
var body: some View {
GeometryReader { geometry in
BottomSheetView(
scannedCode: self.$scannedCode,
isOpen: self.$bottomSheetShown,
maxHeight: geometry.size.height * 0.7
) {
Color.blue
}
}.edgesIgnoringSafeArea(.all)
}
}
struct FoundItemSheet_Previews: PreviewProvider {
static var previews: some View {
FoundItemSheet()
}
}
Я получаю exc_breakpoint, я полагаю где объявлен CodeScanner.
Я зацикливался на этом несколько часов, поэтому быстро отвечу на любые вопросы.