如何在子视图SwiftUI中使用BaseView@State属性

如何在子视图SwiftUI中使用BaseView@State属性,swift,swiftui,viewbuilder,Swift,Swiftui,Viewbuilder,我有一个类似这样的BaseView,我想将警报机制添加到我的所有子视图中 struct BaseView<Content: View>: View { @State var isAlertPresented = false let content: Content init(@ViewBuilder content: () -> Content) { self.content = content() }

我有一个类似这样的BaseView,我想将警报机制添加到我的所有子视图中

struct BaseView<Content: View>: View {
    @State var isAlertPresented = false
    let content: Content
    
    init(@ViewBuilder content: () -> Content) {
        self.content = content()
    }
    
    var body : some View {
        content.alert(isPresented: $isAlertPresented) {
            Alert(title: Text("title"))
        }
    }

}

我可以这样做吗?如果是,我怎么做?

如果视图包含BaseView,则它肯定不是与其相关的子视图。而且,您不应该访问/操纵其他视图的内部状态,因为这是一个违反真理的来源

相反,您必须在这种情况下使用绑定,如下所示(使用Xcode 11.7测试)

struct BaseView:View{
@绑定变量isAlertPresented:Bool
让内容:内容
init(isAlertPresented:Binding,@ViewBuilder内容:()->content){
self.\u isAlertPresented=isAlertPresented
self.content=content()
}
var body:一些观点{
content.alert(isPresented:$isAlertPresented){
警报(标题:文本(“标题”))
}
}
}
结构SomeOtherView:View{
@状态私有变量showAlert=false
var body:一些观点{
BaseView(isAlertPresented:$showAlert){
文本(“测试”)
}
.onReceive(vm.publisher){(输出)在
//.onAppear{//仅用于测试而不是上面的
self.showart=true
}
}
}

谢谢Asperi。这个解决方案对我来说还可以。但我还有30个其他视图。我是否必须为所有视图设置
@Binding var isAlertPresented:Bool
属性?
struct SubView: View {
    BaseView {
        Text("")
    }.onReceive(vm.publisher) { (output) in
        // here I want to trigger BaseView isAlertPresented property        
        // BaseView.isAlertPresented = true
    }
}
struct BaseView<Content: View>: View {
    @Binding var isAlertPresented: Bool
    let content: Content

    init(isAlertPresented: Binding<Bool>, @ViewBuilder content: () -> Content) {
        self._isAlertPresented = isAlertPresented
        self.content = content()
    }

    var body : some View {
        content.alert(isPresented: $isAlertPresented) {
            Alert(title: Text("title"))
        }
    }

}

struct SomeOtherView: View {
    @State private var showAlert = false

    var body: some View {
        BaseView(isAlertPresented: $showAlert) {
            Text("Test")
        }
        .onReceive(vm.publisher) { (output) in
//        .onAppear {     // used instead of above just for test
            self.showAlert = true
        }
    }
}