когда я запускаю приведенный ниже код и нажимаю на учетную запись, отображаются все строки журнала, связанные с этой учетной записью. если я нажимаю кнопку «Добавить», он обновляет список 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))
}
}