skip to Main Content

I have an issue with the coding for my app, where I want to be able to scan a QR and bring it to the next page through navigation link. Right now I am able to scan a QR code and get a link but that is not a necessary function for me. Below I attached my code and got the issue "Argument passed to call that takes no arguments", any advice or help would be appreciated 🙂

struct QRCodeScannerExampleView: View {
    @State private var isPresentingScanner = false
    @State private var scannedCode: String?

    var body: some View {
        VStack(spacing: 10) {
            if let code = scannedCode {
                //error below
                NavigationLink("Next page", destination: PageThree(scannedCode: code), isActive: .constant(true)).hidden()
            }

            Button("Scan Code") {
                isPresentingScanner = true
            }

            Text("Scan a QR code to begin")
        }
        .sheet(isPresented: $isPresentingScanner) {
            CodeScannerView(codeTypes: [.qr]) { response in
                if case let .success(result) = response {
                    scannedCode = result.string
                    isPresentingScanner = false
                }
            }
        }
    }
}

Page Three Code

import SwiftUI

struct PageThree: View {
    var body: some View {
        Text("Hello, World!")
    }
}

struct PageThree_Previews: PreviewProvider {
    static var previews: some View {
        PageThree()
    }
}

2

Answers


  1. You forgot property:

    struct PageThree: View {
        var scannedCode: String = ""   // << here !!
        var body: some View {
            Text("Code: " + scannedCode)
        }
    }
    
    Login or Signup to reply.
  2. You create your PageThree View in two ways, One with scannedCode as a parameter, one with no params.

    PageThree(scannedCode: code)
    
    PageThree()
    

    Meanwhile, you defined your view with no initialize parameters

    struct PageThree: View {
        var body: some View {
            Text("Hello, World!")
        }
    }
    

    For your current definition, you only can use PageThree() to create your view. If you want to pass value while initializing, change your view implementation and consistently using one kind of initializing method.

    struct PageThree: View {
        var scannedCode: String
        var body: some View {
            Text(scannedCode)
        }
    }
    

    or

    struct PageThree: View {
        private var scannedCode: String
        init(code: String) {
            scannedCode = code
        }
        var body: some View {
            Text(scannedCode)
        }
    }
    

    This is basic OOP, consider to learn it well before jump-in to development.
    https://docs.swift.org/swift-book/LanguageGuide/Initialization.html

    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search