无法使用@EnvironmentObject SwiftUI 更新上一个视图上的文本
Can't Update Text on Previous View using @EnvironmentObject SwiftUI
我是 SwiftUI 的新手。所以,我正在练习并创建某种收银员应用程序,我在这里被困了一段时间。在 ProductPageView
中,我可以增加和减少项目的数量。然后,当我转到 DetailOrderView
(如购物车视图)时,我还可以增加和减少数量。印刷品正确显示数量。
但是如果我回到 ProductPageView
,标签不会自行更新。
看看这个截图:
首先,我添加了 2 个项目。
那我去DetailOrderView
,数量是一样的:
然后我在 DetailOrderView
中添加了 2 件商品(所以现在是 4 件商品)并返回到 ProductPageView
,请注意总价如何增加但数量没有变化。我觉得我想在此页面上“刷新”或“重新加载数据”。
我如何解决这个问题并在我按下后退按钮时更新文本?
这是我的代码:
主要
import SwiftUI
@main
struct CashierApp: App {
@StateObject var productOder = ProductPresenter()
var body: some Scene {
WindowGroup {
MainPageView()
.environmentObject(productOder)
}
}
}
产品页面浏览量
导入 SwiftUI
struct ProductPageView: View {
@EnvironmentObject var productOrder: ProductPresenter
var body: some View {
VStack {
ScrollView {
VStack {
ForEach(productOrder.cartItems, id: \.item.idItem) { element in
ProductRow(cartItems: CartItems(item: element.item, quantity: element.quantity))
}
}
}
TotalPaymentRow()
}
}
}
详细订单视图或购物车视图
导入 SwiftUI
struct DetailOrderView: View {
@EnvironmentObject var productOrder: ProductPresenter
var arrayOrdered: [CartItems] = []
var body: some View {
ZStack {
ScrollView {
VStack {
ForEach(arrayOrdered, id: \.item.idItem) { element in
ProductRow(cartItems: CartItems(item: element.item, quantity: element.quantity))
}
}
.padding(.top, 10)
}
CustomModalGrandTotal()
}
.navigationTitle("Cart")
.navigationBarTitleDisplayMode(.inline)
}
}
主持人
import SwiftUI
import Combine
class ProductPresenter: ObservableObject {
@Published var cartItems: [CartItems] = []
var totalQuantity = 0
// Increment product
func increment(cartItem: inout CartItems) {
let index: Int = cartItems.firstIndex(where: {[=13=].item == cartItem.item}) ?? -1
cartItems[index].quantity += 1
totalQuantity += 1
}
// Decrement product
func decrement(cartItem: inout CartItems) {
let index: Int = cartItems.firstIndex(where: {[=13=].item == cartItem.item}) ?? -1
if cartItems[index].quantity > 0 {
cartItems[index].quantity -= 1
totalQuantity -= 1
}
}
}
产品行
import SwiftUI
struct ProductRow: View {
@State var cartItems: CartItems
@EnvironmentObject var productOrder: ProductPresenter
var body: some View {
HStack(alignment: .center) {
Image(cartItems.item.image ?? "")
VStack(alignment: .leading, spacing: 8) {
Text(cartItems.item.name ?? "")
Text(getPrice(value: cartItems.item.price ?? 0))
}
Spacer()
VStack {
Spacer()
HStack{
Button(action: {
if cartItems.quantity > 0 {
cartItems.quantity -= 1
productOrder.decrement(cartItem: &cartItems)
productOrder.calculateTotalPrice()
}
}, label: {
imageMinusPlus(name: "minus")
})
Text("\(cartItems.quantity)") // This Text should be updated.
Button(action: {
cartItems.quantity += 1
productOrder.increment(cartItem: &cartItems)
productOrder.calculateTotalPrice()
}, label: {
imageMinusPlus(name: "plus")
})
}
}
}
}
}
PS: 我删除了样式以使代码更短。
提前致谢
我认为 productOrder 需要定义为具有 @Published 属性的 ObservableObject,并且在这种情况下它需要 class 而不是结构,例如:
import SwiftUI
import Combine
final class ProductOder: ObservableObject {
@Published var cartItems: [CartItem] = []
}
除了将“ProductPresenter”实例作为“环境”对象(您正在正确处理)传递之外,您还需要将您的属性声明为@Published,例如“totalQuantity”的情况,它现在更新了总数量.
class ProductPresenter: ObservableObject {
@Published var cartItems: [CartItems] = [
CartItems(item: CartItems.Item(image: "system.car", name: "My item", price: 10, idItem: UUID()), quantity: 3)
]
@Published var totalQuantity = 0
}
但这并不能解决这一行问题:
Text("\(cartItems.quantity)") // This Text should be updated.
原因如下:
- 您的模型 (CartItems) 必须是 class 类型并符合
ObservableObject 协议
- 您的 属性 必须使用 @Published 进行设置。
我是 SwiftUI 的新手。所以,我正在练习并创建某种收银员应用程序,我在这里被困了一段时间。在 ProductPageView
中,我可以增加和减少项目的数量。然后,当我转到 DetailOrderView
(如购物车视图)时,我还可以增加和减少数量。印刷品正确显示数量。
但是如果我回到 ProductPageView
,标签不会自行更新。
看看这个截图:
首先,我添加了 2 个项目。
那我去DetailOrderView
,数量是一样的:
然后我在 DetailOrderView
中添加了 2 件商品(所以现在是 4 件商品)并返回到 ProductPageView
,请注意总价如何增加但数量没有变化。我觉得我想在此页面上“刷新”或“重新加载数据”。
我如何解决这个问题并在我按下后退按钮时更新文本?
这是我的代码:
主要
import SwiftUI
@main
struct CashierApp: App {
@StateObject var productOder = ProductPresenter()
var body: some Scene {
WindowGroup {
MainPageView()
.environmentObject(productOder)
}
}
}
产品页面浏览量 导入 SwiftUI
struct ProductPageView: View {
@EnvironmentObject var productOrder: ProductPresenter
var body: some View {
VStack {
ScrollView {
VStack {
ForEach(productOrder.cartItems, id: \.item.idItem) { element in
ProductRow(cartItems: CartItems(item: element.item, quantity: element.quantity))
}
}
}
TotalPaymentRow()
}
}
}
详细订单视图或购物车视图 导入 SwiftUI
struct DetailOrderView: View {
@EnvironmentObject var productOrder: ProductPresenter
var arrayOrdered: [CartItems] = []
var body: some View {
ZStack {
ScrollView {
VStack {
ForEach(arrayOrdered, id: \.item.idItem) { element in
ProductRow(cartItems: CartItems(item: element.item, quantity: element.quantity))
}
}
.padding(.top, 10)
}
CustomModalGrandTotal()
}
.navigationTitle("Cart")
.navigationBarTitleDisplayMode(.inline)
}
}
主持人
import SwiftUI
import Combine
class ProductPresenter: ObservableObject {
@Published var cartItems: [CartItems] = []
var totalQuantity = 0
// Increment product
func increment(cartItem: inout CartItems) {
let index: Int = cartItems.firstIndex(where: {[=13=].item == cartItem.item}) ?? -1
cartItems[index].quantity += 1
totalQuantity += 1
}
// Decrement product
func decrement(cartItem: inout CartItems) {
let index: Int = cartItems.firstIndex(where: {[=13=].item == cartItem.item}) ?? -1
if cartItems[index].quantity > 0 {
cartItems[index].quantity -= 1
totalQuantity -= 1
}
}
}
产品行
import SwiftUI
struct ProductRow: View {
@State var cartItems: CartItems
@EnvironmentObject var productOrder: ProductPresenter
var body: some View {
HStack(alignment: .center) {
Image(cartItems.item.image ?? "")
VStack(alignment: .leading, spacing: 8) {
Text(cartItems.item.name ?? "")
Text(getPrice(value: cartItems.item.price ?? 0))
}
Spacer()
VStack {
Spacer()
HStack{
Button(action: {
if cartItems.quantity > 0 {
cartItems.quantity -= 1
productOrder.decrement(cartItem: &cartItems)
productOrder.calculateTotalPrice()
}
}, label: {
imageMinusPlus(name: "minus")
})
Text("\(cartItems.quantity)") // This Text should be updated.
Button(action: {
cartItems.quantity += 1
productOrder.increment(cartItem: &cartItems)
productOrder.calculateTotalPrice()
}, label: {
imageMinusPlus(name: "plus")
})
}
}
}
}
}
PS: 我删除了样式以使代码更短。
提前致谢
我认为 productOrder 需要定义为具有 @Published 属性的 ObservableObject,并且在这种情况下它需要 class 而不是结构,例如:
import SwiftUI
import Combine
final class ProductOder: ObservableObject {
@Published var cartItems: [CartItem] = []
}
除了将“ProductPresenter”实例作为“环境”对象(您正在正确处理)传递之外,您还需要将您的属性声明为@Published,例如“totalQuantity”的情况,它现在更新了总数量.
class ProductPresenter: ObservableObject {
@Published var cartItems: [CartItems] = [
CartItems(item: CartItems.Item(image: "system.car", name: "My item", price: 10, idItem: UUID()), quantity: 3)
]
@Published var totalQuantity = 0
}
但这并不能解决这一行问题:
Text("\(cartItems.quantity)") // This Text should be updated.
原因如下:
- 您的模型 (CartItems) 必须是 class 类型并符合 ObservableObject 协议
- 您的 属性 必须使用 @Published 进行设置。