SwiftUI: Как обновить передаваемый элемент массива в другом представлении - PullRequest
1 голос
/ 26 февраля 2020

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

Мой код:

Модель:

    struct WalletItem: Identifiable{

        let id = UUID()
        var name:String
        var cardNumber:String
        var type:String
        var cvc:String
        let pin:String
        var dateOfExpiry:String
    }

ModelView:

    class Wallet: ObservableObject{

        @Published var wallets = [
            WalletItem(name: "BSB", cardNumber: "123456789", type: "master card", cvc: "1234", pin: "1234", dateOfExpiry: "2016-06-29"),
            WalletItem(name: "Alpha bank", cardNumber: "123456789", type: "master card", cvc: "1234", pin: "1234", dateOfExpiry: "2017-03-12"),
            WalletItem(name: "MTБ", cardNumber: "123456789", type: "master card", cvc: "1234", pin: "1234", dateOfExpiry: "2020-11-12"),
        ]

    }

Первый просмотр:

    struct WalletListView: View {

        // Properties
        // ==========

        @ObservedObject var wallet = Wallet()
        @State var isNewItemSheetIsVisible = false


        var body: some View {
            NavigationView {
                List(wallet.wallets) { walletItem in
                    NavigationLink(destination: EditWalletItem(walletItem: walletItem)){
                            Text(walletItem.name)
                        }
                }
                .navigationBarTitle("Cards", displayMode: .inline)
                .navigationBarItems(
                    leading: Button(action: { self.isNewItemSheetIsVisible = true
                    }) {
                        HStack {
                            Image(systemName: "plus.circle.fill")
                            Text("Add item")
                        }
                    }
                )
            }
            .sheet(isPresented: $isNewItemSheetIsVisible) {
                NewWalletItem(wallet: self.wallet)
            }
        } 

    }

и Вторичный просмотр:

    struct EditWalletItem: View {

        @State var walletItem: WalletItem


        @Environment(\.presentationMode) var presentationMode

        var body: some View {
            Form{
                Section(header: Text("Card Name")){
                    TextField("", text: $walletItem.name)
                }

            }
            .navigationBarItems(leading:
                Button(action: {
                    self.presentationMode.wrappedValue.dismiss()
                })
                {
                    Text("Back")
                }, trailing:
                Button(action: {

                    self.presentationMode.wrappedValue.dismiss()
                })
                {
                    Text("Save")
            })

        }

    }

PS: если я использую @Binding вместо @State у меня появляется ошибка в первом представлении: инициализатор init(_:) требует, чтобы Binding<String> соответствовал StringProtocol

1 Ответ

2 голосов
/ 26 февраля 2020

Вот модифицированные части (проверено и работает с Xcode 11.2 / iOS 13.2):

1) Обязательно переплет

struct EditWalletItem: View {
    @Binding var walletItem: WalletItem

2) Место для прохождения

List(Array(wallet.wallets.enumerated()), id: \.element.id) { (i, walletItem) in
    NavigationLink(destination: EditWalletItem(walletItem: self.$wallet.wallets[i])){
            Text(walletItem.name)
        }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...