Swift: NavigationLink calling destination's init method multiple times

时光总嘲笑我的痴心妄想 提交于 2021-02-05 07:50:48

问题


I have two classes SubmitPhoneView and VerifyPhoneView.

For some reason, I noticed that whenever I input a digit into the textfield of SubmitPhoneView, it calls the init method of VerifyPhoneView. I want it to only be called once (when I press the continue button on SubmitPhoneView)

Why would this be?

Class SubmitPhoneView:

import SwiftUI
import Firebase

struct SubmitPhoneView: View {

    @State private var phoneNumber: String = ""
    @State private var verificationID : String = ""
    @State private var presentMe = false

    var body: some View {

        ZStack {

            Text("My number is")

            HStack(spacing: 20){
                Text("+1")

                TextField("Enter phone number", text: $phoneNumber)
                    .keyboardType(.numberPad)
            }

            VStack {

                NavigationLink(destination: VerifyPhoneView(phoneNumber: $phoneNumber.wrappedValue, verificationID: $verificationID.wrappedValue), isActive: $presentMe) { EmptyView() }

                Button(action: {
                    self.submitPhoneNumber()
                    self.presentMe = true
                }) {
                    Text("Continue")
            }
        }
    }

    func submitPhoneNumber() {
        PhoneAuthProvider.provider().verifyPhoneNumber("+1" + phoneNumber, uiDelegate: nil) { (verificationID, error) in
            if error != nil {
                print(error.debugDescription)
                return
            }
            else {
                self.verificationID = verificationID!
            }
        }
    }

}

Class VerifyPhoneView:

import SwiftUI
import Firebase

struct VerifyPhoneView: View {

    private var phoneNumber: String
    @State private var verificationID: String
    @State private var verificationCode: String = ""
    @State private var loginSuccesful: Bool = false
    @EnvironmentObject var ls: LoginStatus
    @EnvironmentObject var currentUser: CurrentUser

    init(phoneNumber: String, verificationID: String) {
        print("the init method was called for VerifyPhoneView")
        self.phoneNumber = phoneNumber
       _verificationID = State(initialValue: verificationID)
        print(self.verificationID)
    }

    var body: some View {

        ZStack {

            Text("My code is")

            TextField("Enter code", text: $verificationCode)

            Button(action: {
                self.submitVerificationCode()
            }) {
                Text("Continue")
            }

        }

    }

    func submitPhoneNumber() {
       // doesn't matter
    }

    func submitVerificationCode() {
       // doesn't matter
    }

    }    

}

回答1:


Use DeferView, as below

VStack {

    NavigationLink(destination: DeferView {
       VerifyPhoneView(phoneNumber: $phoneNumber.wrappedValue, verificationID: $verificationID.wrappedValue) 
    }, isActive: $presentMe) { EmptyView() }

    Button(action: {
        self.submitPhoneNumber()
        self.presentMe = true
    }) {
        Text("Continue")
}


来源:https://stackoverflow.com/questions/61742647/swift-navigationlink-calling-destinations-init-method-multiple-times

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!