【问题标题】:Swift: NavigationLink calling destination's init method multiple timesSwift:NavigationLink 多次调用目的地的 init 方法
【发布时间】:2020-08-27 18:11:48
【问题描述】:

我有两个类 SubmitPhoneView 和 VerifyPhoneView。

由于某种原因,我注意到每当我在 SubmitPhoneView 的文本字段中输入一个数字时,它都会调用 VerifyPhoneView 的 init 方法。我希望它只被调用一次(当我按下 SubmitPhoneView 上的继续按钮时)

为什么会这样?

类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!
            }
        }
    }

}

类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
    }

    }    

}

【问题讨论】:

  • 我将导航链接中的参数更改为硬编码占位符,似乎目的地的 init 只调用了一次。因此,似乎每次电话号码的状态发生变化时,都会调用目标 init 方法。我怎样才能停止这种情况,这样它只会在按下继续按钮时发生?

标签: swiftui


【解决方案1】:

使用DeferView,如下

VStack {

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

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

【讨论】:

  • 刚刚使用 Xcode 12GM / iOS 14GM 重新测试 - 按预期工作。
  • 我创建了一个单独的SO post 来解决我遇到的问题。它可能是相关的,但是 DeferView 不能解决它。
猜你喜欢
  • 2010-11-11
  • 1970-01-01
  • 1970-01-01
  • 2012-12-26
  • 2019-05-01
  • 2013-10-22
  • 1970-01-01
  • 2011-03-30
  • 1970-01-01
相关资源
最近更新 更多