gpt4 book ai didi

swift - SwiftUI View 协议(protocol)中的 EnvironmentObject

转载 作者:行者123 更新时间:2023-12-04 08:40:20 25 4
gpt4 key购买 nike

我想制定这样的协议(protocol):

protocol SubscriptionManagerView: View {
var subscriptionManager: EnvironmentObject<SubscriptionManager> { get set }
}
以这样的 View 为例:
struct Shop: View, SubscriptionManager {
@EnvironmentObject var subscriptionManager: SubscriptionManager
第一个问题是属性包装器@EnvironmentObject 不能让我响应协议(protocol) SubscriptionManagerView。
最后我想使用这样的自定义修饰符:
extension View where Self : SubscriptionManagerView {
func subscriptionManagerAlert() -> some View {
self.alert(isPresented: self.$subscriptionManager.stateShowAlert) {
Alert(title: Text(self.subscriptionManager.transactionStateTitle)
...
}))
}
}
}
任何想法以这种方式工作?

最佳答案

这是一个可能的方法的演示 - 想法是使用 View 修饰符和显式注入(inject)的订阅管理器,因此接口(interface)契约保证修饰符的客户端 View 将为我们提供所需的对象。
使用 Xcode 12/iOS 14 测试。

class SubscriptionManager: ObservableObject {
@Published var stateShowAlert: Bool = false
@Published var transactionStateTitle = "Test"
}

struct SubscriptionManagerModifier: ViewModifier {
@ObservedObject var subscriptionManager: SubscriptionManager
func body(content: Content) -> some View {
content
.alert(isPresented: self.$subscriptionManager.stateShowAlert) {
Alert(title: Text(self.subscriptionManager.transactionStateTitle))
}
}
}

extension View {
func subscriptionManagerAlert(with subscriptionManager: SubscriptionManager) -> some View {
self.modifier(SubscriptionManagerModifier(subscriptionManager: subscriptionManager))
}
}

struct Shop: View {

@EnvironmentObject var subscriptionManager: SubscriptionManager

var body: some View {
Button("Test") {
subscriptionManager.stateShowAlert.toggle()
}
.subscriptionManagerAlert(with: subscriptionManager)
}
}

struct Shop_Previews: PreviewProvider {
static var previews: some View {
Shop().environmentObject(SubscriptionManager())
}
}

关于swift - SwiftUI View 协议(protocol)中的 EnvironmentObject,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64596044/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com