Список SwiftUI не обновляется - PullRequest
0 голосов
/ 08 марта 2020

когда я запускаю приведенный ниже код и нажимаю на учетную запись, отображаются все строки журнала, связанные с этой учетной записью. если я нажимаю кнопку «Добавить», он обновляет список journalLines, добавляя новые journalLines. Но только один раз. когда я нажимаю на нее снова, это увеличивает баланс, но не обновляет список строк. Если вы нажмете другую учетную запись, а затем нажмите назад, вы увидите полный список. но он только автоматически обновляет список один раз?

Я пытался заменить account.lines в списке на self.shared.journalLines.filter({$0.accountID == account.id}), но у меня такое же поведение.

это ошибка или я что-то пропустил ? Если это ошибка, какой обходной путь?

import SwiftUI

struct ContentView: View {

    @EnvironmentObject var shared:SharedObject

    var body: some View {
        NavigationView {
            VStack {
                Button(action: {self.shared.test()}) {Text("Add")}
                List(self.shared.accounts) { account in
                    NavigationLink(destination:
                        List(self.shared.journalLines.filter({$0.accountID == account.id})) { line in
                            HStack {
                                Text(line.payee)
                                Spacer()
                                Text("$ \(line.amount, specifier: "%.2f")")
                            }
                        }.frame(maxWidth: .infinity, maxHeight: .infinity)
                    ) {
                        HStack {
                            Text(account.name)
                            Spacer()
                            Text("$ \(account.balance, specifier: "%.2f")")
                        }
                    }
                }
                .frame(width: 200)
            }
        }.frame(maxWidth: .infinity, maxHeight: .infinity)
    }

}

struct Account:Identifiable {
    @ObservedObject var shared:SharedObject
    var id:Int
    var name:String
    var lines:[JournalLine] {
        return self.shared.journalLines.filter({$0.accountID == self.id})
    }
    var balance:Double {
        return self.lines.map({$0.amount}).reduce(0){$0+$1}
    }
}
struct JournalLine:Identifiable {
    @ObservedObject var shared:SharedObject
    let id:UUID = UUID()
    var payee:String
    var accountID:Int
    var amount:Double
}

class SharedObject:ObservableObject {
    @Published var accounts:[Account] = []
    @Published var journalLines:[JournalLine] = []

    init() {

        self.accounts.append(Account(shared: self,id: 1, name: "Account#1"))
        self.accounts.append(Account(shared: self,id: 2, name: "Account#2"))
        self.accounts.append(Account(shared: self,id: 3, name: "Account#3"))

        self.journalLines.append(JournalLine(shared: self, payee: "Payee1", accountID: 1, amount: 100))
        self.journalLines.append(JournalLine(shared: self, payee: "Payee2", accountID: 1, amount: 200))
        self.journalLines.append(JournalLine(shared: self, payee: "Payee3", accountID: 2, amount: 300))
        self.journalLines.append(JournalLine(shared: self, payee: "Payee4", accountID: 2, amount: 400))
        self.journalLines.append(JournalLine(shared: self, payee: "Payee5", accountID: 3, amount: 500))
        self.journalLines.append(JournalLine(shared: self, payee: "Payee6", accountID: 3, amount: 600))

    }

    func test() {
        self.journalLines.append(JournalLine(shared: self, payee: "Payee10", accountID: 1, amount: 100))
        self.journalLines.append(JournalLine(shared: self, payee: "Payee10", accountID: 2, amount: 100))
        self.journalLines.append(JournalLine(shared: self, payee: "Payee10", accountID: 3, amount: 100))
    }

}

edit: исправлен код с предложениями из комментариев. По-прежнему получаются те же ошибки с внесенными изменениями

import SwiftUI

struct ContentView: View {

    @EnvironmentObject var shared:SharedObject

    var body: some View {
        NavigationView {
            VStack {
                Button(action: {self.shared.test()}) {Text("Add")}.padding()
                List {
                    ForEach(self.shared.accounts) { account in
                        NavigationLink(destination:
                            List {
                                ForEach(self.shared.journalLines.filter({$0.accountID == account.id})) { line in
                                    HStack {
                                        Text(line.payee)
                                        Spacer()
                                        Text("$ \(line.amount, specifier: "%.2f")")
                                    }
                                }
                            }.frame(maxWidth: .infinity, maxHeight: .infinity)
                        ) {
                            HStack {
                                Text(account.name)
                                Spacer()
                                Text("$ \(self.shared.journalLines.filter({$0.accountID == account.id}).map({$0.amount}).reduce(0){$0+$1}, specifier: "%.2f")")
                            }
                        }
                    }
                }
                .frame(width: 200)
            }
        }.frame(maxWidth: .infinity, maxHeight: .infinity)
    }

}

class Account:Identifiable {
    init(id:Int,name:String) {
        self.id=id
        self.name=name
    }
    var id:Int
    var name:String
}
class JournalLine:Identifiable {
    init(payee:String,accountID:Int,amount:Double) {
        self.payee=payee
        self.accountID=accountID
        self.amount=amount
    }
    let id:UUID = UUID()
    var payee:String
    var accountID:Int
    var amount:Double
}

class SharedObject:ObservableObject {
    @Published var accounts:[Account] = []
    @Published var journalLines:[JournalLine] = []

    init() {

        self.accounts.append(Account(id: 1, name: "Account#1"))
        self.accounts.append(Account(id: 2, name: "Account#2"))
        self.accounts.append(Account(id: 3, name: "Account#3"))

        self.journalLines.append(JournalLine(payee: "Payee1", accountID: 1, amount: 100))
        self.journalLines.append(JournalLine(payee: "Payee2", accountID: 1, amount: 200))
        self.journalLines.append(JournalLine(payee: "Payee3", accountID: 2, amount: 300))
        self.journalLines.append(JournalLine(payee: "Payee4", accountID: 2, amount: 400))
        self.journalLines.append(JournalLine(payee: "Payee5", accountID: 3, amount: 500))
        self.journalLines.append(JournalLine(payee: "Payee6", accountID: 3, amount: 600))

    }

    func test() {
        self.journalLines.append(JournalLine(payee: "Payee10", accountID: 1, amount: 100))
        self.journalLines.append(JournalLine(payee: "Payee10", accountID: 2, amount: 100))
        self.journalLines.append(JournalLine(payee: "Payee10", accountID: 3, amount: 100))
    }

}

1 Ответ

1 голос
/ 08 марта 2020

Ответ

Я не знаю, является ли это ошибкой или функцией, но List является своего рода сообщением c, что означает, что не нужно искать обновления. Если вы хотите отслеживать обновления, общий обходной путь - это размещение ForEach внутри List. Таким образом, ваше представление обновляется каждый раз, когда вы обновляете свой @Published объект.

Вот как сделать список + часть foreach https://www.hackingwithswift.com/quick-start/swiftui/building-a-menu-using-list

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...