SwiftUI:当superview也可以显示图纸时,如果从子视图触发,则不显示图纸

SwiftUI:当superview也可以显示图纸时,如果从子视图触发,则不显示图纸,swiftui,swiftui-state,Swiftui,Swiftui State,假设我在NavigationView中有一个视图,带有前导和尾随按钮。 因为我可以从该视图显示两个不同的图纸,所以我使用如下枚举: enum AccountActiveSheet { case about, settings } 此主视图在视图中有两个@State属性,用于触发图纸显示 @State private var isSheetPresented: Bool = false @State private var activeSheet: AccountActiveSheet =

假设我在NavigationView中有一个视图,带有前导和尾随按钮。 因为我可以从该视图显示两个不同的图纸,所以我使用如下枚举:

enum AccountActiveSheet {
   case about, settings
}
此主视图在视图中有两个@State属性,用于触发图纸显示

@State private var isSheetPresented: Bool = false
@State private var activeSheet: AccountActiveSheet = .about
每个按钮都可以触发一张工作表

var aboutButton: some View {
    Button(action: {
        self.activeSheet = .about
        self.isSheetPresented.toggle()
    }, label: {
        Image(systemName: "info.circle.fill")
    })
}
在导航视图的末尾,我选择了正确的工作表以这样显示

.sheet(isPresented: $isSheetPresented) {
   self.activeSheet.sheet
}
它工作得很好,并以模态的形式呈现正确的视图

但我在这个主视图中也有多个子视图,可以在点击按钮时显示图纸。在这种情况下,不显示子视图管理的工作表(即@State变量,用于跟踪子视图提供的工作表的$isSheetPresented+内容)。什么也没发生。superview图纸修改器似乎阻止子视图显示图纸

是否可以同时使用superview和subview管理图纸演示文稿

enum AccountActiveSheet {
    case about, settings

    @ViewBuilder
    var sheet: some View {
        switch self {
        case .about: Text("About")
        case .settings: Text("Settings")
        }
    }
}

struct AccountView: View {
    @State private var isSheetPresented: Bool = false
    @State private var activeSheet: AccountActiveSheet = .about
    
    var aboutButton: some View {
        Button(action: {
            self.activeSheet = .about
            self.isSheetPresented.toggle()
        }, label: {
            Image(systemName: "info.circle.fill")
        })
    }
    
    var settingsButton: some View {
        Button(action: {
            self.activeSheet = .settings
            self.isSheetPresented.toggle()
        }, label: {
            Image(systemName: "gearshape.fill")
        })
    }

    var body: some View {
        NavigationView {
            VStack {
                Subview()
            }
            .navigationBarTitle("Account", displayMode: .inline)
            .navigationBarItems(leading: aboutButton, trailing: settingsButton)
            .sheet(isPresented: $isSheetPresented) {
                self.activeSheet.sheet
            }
        }
    }
}

struct Subview: View {
    @State var isSheetPresented: Bool = false

    var body: some View {
        Button("Present sheet") {
            self.isSheetPresented.toggle()
        }
        .sheet(isPresented: $isSheetPresented) {
            Text("Subview")
        }
    }
}

将根视图工作表移出导航视图(使用Xcode 12.1/iOS 14.1测试)

var主体:一些视图{
导航视图{
VStack{
子视图()
}
.navigationBarTitle(“帐户”,显示模式:。内联)
.navigationBarItems(前导:关于按钮,尾随:设置按钮)
}

.sheet(isPresented:$isSheetPresented){//提供的代码不足以复制您的案例。您是否提供了完整的可复制示例?@Asperi我更新了我的答案,以包含完整的工作示例。让我知道!是否有解释(推测性或其他)说明此操作的原因?
var body: some View {
    NavigationView {
        VStack {
            Subview()
        }
        .navigationBarTitle("Account", displayMode: .inline)
        .navigationBarItems(leading: aboutButton, trailing: settingsButton)
    }
    .sheet(isPresented: $isSheetPresented) {   // << here !!
        self.activeSheet.sheet
    }
}