SwiftUI视图协议中的EnvironmentObject
我想制定如下协议:SwiftUI视图协议中的EnvironmentObject,swift,view,swiftui,protocols,Swift,View,Swiftui,Protocols,我想制定如下协议: protocol SubscriptionManagerView: View { var subscriptionManager: EnvironmentObject<SubscriptionManager> { get set } } extension View where Self : SubscriptionManagerView { func subscriptionManagerAlert() -> some View {
protocol SubscriptionManagerView: View {
var subscriptionManager: EnvironmentObject<SubscriptionManager> { get set }
}
extension View where Self : SubscriptionManagerView {
func subscriptionManagerAlert() -> some View {
self.alert(isPresented: self.$subscriptionManager.stateShowAlert) {
Alert(title: Text(self.subscriptionManager.transactionStateTitle)
...
}))
}
}
}
第一个问题是属性包装器@EnvironmentObject无法使我响应协议SubscriptionManagerView
最后,我想使用如下自定义修改器:
protocol SubscriptionManagerView: View {
var subscriptionManager: EnvironmentObject<SubscriptionManager> { get set }
}
extension View where Self : SubscriptionManagerView {
func subscriptionManagerAlert() -> some View {
self.alert(isPresented: self.$subscriptionManager.stateShowAlert) {
Alert(title: Text(self.subscriptionManager.transactionStateTitle)
...
}))
}
}
}
有没有这样的想法?这里是一个可能方法的演示-想法是将视图修改器与显式注入的subscription manager一起使用,因此接口契约保证修改器的客户端视图将为我们提供所需的对象 使用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())
}
}
@EnvironmentObject-var-subscriptionManager:subscriptionManager
不相等var-subscriptionManager:EnvironmentObject
非常感谢!我好奇地想知道是否有任何使用协议的方法……这有点愚蠢;不是在你执行它,而是在需要它。这只是一个无法将多个对象推入环境的问题,还是环境不可靠?