0

GitHub 项目链接

我有一个 creditCard 模型和 CreditCards 类,它具有附加 creditCard 的功能。

class CreditCard: ObservableObject, Identifiable {
@Published var _id: String = UUID().uuidString
@Published var _cardOwnerName : String = ""
@Published var _cardNumber: String = ""
@Published var _cardExpMonth: String = ""
@Published var _cardExpYear: String = ""
@Published var _cardName: String = ""
@Published var _ccv: String = ""

@Published var items = [CreditCard]()

init(cardOwnerName: String, cardNumber: String, cardExpMonth: String,cardExpYear: String, cardName:String, ccv:String)
    {
        self._cardOwnerName = cardOwnerName
        self._cardNumber = cardNumber
        self._cardExpMonth = cardExpMonth
        self._cardExpYear = cardExpYear
        self._cardName = cardName
        self._ccv = ccv
    }
 }

class CreditCards: ObservableObject {
@Published var items = [CreditCard]()


func appendNewCreditCard(creditCard: CreditCard) {
    objectWillChange.send()
    items.append(CreditCard(cardOwnerName: creditCard._cardOwnerName, cardNumber: creditCard._cardNumber, cardExpMonth: creditCard._cardExpMonth, cardExpYear: creditCard._cardExpYear, cardName: creditCard._cardName, ccv: creditCard._ccv))
   }
}

当通过一个按钮满足所有条件时,我正在附加一张新的信用卡。

struct CardInfo : View {
@State var creditCard : CreditCard
@ObservedObject var creditCards = CreditCards()

  CreditCardTextField(data: $cardNumberText, tFtext: "Kredi Kart Numarasi", tFImage: "credit")
                .textContentType(.oneTimeCode)
                .keyboardType(.numberPad)
                .onReceive(Just(cardNumberText)) { cardNumberdata in
                    if cardNumberdata.count == 16 {
                        self.creditCard._cardNumber = self.cardNumberText
                    }
            }

  Button(action: {
                    self.isSaved.toggle()
                    if self.creditCard._cardNumber == "" {
                        self.showingAlert = true
                    } else if self.creditCard._cardNumber.count == 16 {
                        self.successAlert = true
                        self.creditCards.objectWillChange.send()
                        self.creditCards.appendNewCreditCard(creditCard: creditCard)
                        DispatchQueue.main.asyncAfter(deadline: .now() + 3) {
                           self.successAlert = false    // hide popup
                           self.showAddressView = true    // eg. activate navigation link
                        }
                    }
                }

当我尝试在我的 PaymentMethodView 中显示如下文本时,我在 PaymentMethodView 上看不到任何文本。

struct PaymentMethodView: View {
@ObservedObject var creditCards = CreditCardArray()
var body: some View {
    VStack {
        TopBarPM()
        MiddleView()
            .padding()
        DetailLine()
        VStack {
            HStack {
                Image("credit")
                VStack {
                    ForEach(creditCards.items) { item in
                        Text(item._cardName)
                }
            }
        }
        Spacer()
    }
}

}

现在我需要在 PaymentMethodView 中显示这些信用卡

4

1 回答 1

1

感谢你的分享。似乎AddCreditCardViewand PaymentMethodView(您在其中引用 a CreditCardArray)是两个完全分开的视图,它们没有相互调用。因此我建议使用CreditCardArrayas EnvironmentObject

目前您正在两个视图中创建 new ObservedObject CreditCardArray,因此您没有任何数据要显示在PaymentMethodView.

使用 an 时,EnvironmentObject您可以将其注入到包含AddCreditCardView和的视图中PaymentMethodView。只需选择SceneDelegate它并替换该行:

let contentView = ContentView()

let contentView = ContentView().environmentObject(CreditCardArray())

在这里,您正在创建一个CreditCardArray可以在整个应用程序中访问的对象。

您现在可以通过替换以下行(in AddCreditCardViewPaymentMethodView)来访问此对象:

@ObservedObject var creditCards = CreditCardArray()

@EnvironmentObject var creditCards: CreditCardArray

为了访问先前创建的数组而不是创建一个新数组。

于 2020-09-22T14:40:08.770 回答