exc_breakpoint при попытке загрузить представление в SwiftUI - PullRequest
1 голос
/ 18 июня 2020

Я пытаюсь сделать приложение для сканера штрих-кода. Я хочу, чтобы сканер загружался при первом запуске приложения, как фон. Затем, когда штрих-код будет отсканирован, загрузите вид сверху, отображающий продукт.

В моем 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.

Я зацикливался на этом несколько часов, поэтому быстро отвечу на любые вопросы.

1 Ответ

1 голос
/ 18 июня 2020

Пара мыслей ..

1) изменить порядок модификаторов

.sheet(isPresented: $isShowingScanner) {
    self.scannerSheet
}
.onAppear(perform: {
    self.isPresentingScanner = true
})

2) сделать активацию листа с задержкой (поскольку иерархия представлений может быть не готова для этого настраиваемого вида сканера)

.onAppear(perform: {
    DispatchQueue.main.asyncAfter(deadline: .now() + 0.5)
       self.isPresentingScanner = true
    }
})
...