【问题标题】:Presenting Sheet modally in SwiftUI在 SwiftUI 中以模态方式呈现工作表
【发布时间】:2021-03-15 23:43:42
【问题描述】:

我正在尝试在导航栏中选择菜单项时显示模式表。但是,工作表不显示。在调试时,我注意到状态变量 showSheet 没有得到更新,我有点不知道为什么它没有更新。

非常感谢任何帮助。谢谢!

另一个帖子 (@State not updating in SwiftUI 2) 也有类似的问题。这是 SwiftUI 中的错误吗?

以下是完整示例

我有一个fileprivate enum,它为视图定义了两种情况 - add 和 edit

fileprivate enum SheetView {
    case add, edit
}

下面是内容视图。 ContentView 声明了两个 @State 变量,这些变量是根据所选菜单项设置的 菜单项 (var actionItems) 位于 NavigationView 上,并具有带有 2 个按钮的菜单 - 添加和编辑。每个按钮都有一个动作集来切换showSheetView 和showSheet 变量。根据选择的项目来呈现内容。内容是使用@ViewBuilder构建的

struct ContentView: View {
    @State private var showSheetView = false
    @State private var showSheet: SheetView? = nil
    
    var body: some View {
        GeometryReader { g in
            NavigationView {
                Text("Main Page")
                    .padding()
                    .navigationBarTitle("Main Page")
                    .navigationBarItems(trailing: actionItems)
            }
        }.sheet(isPresented: $showSheetView) {
            content
        }
    }
    
    var actionItems: some View {
        Menu {
            Button(action: {
                showSheet = .add
                showSheetView.toggle()
            }) {
                Label("Add Asset", systemImage: "plus")
            }
            Button(action: {
                showSheet = .edit
                showSheetView.toggle()
            }) {
                Label("Edit Asset", systemImage: "minus")
            }
        } label: {
            Image(systemName: "dot.circle.and.cursorarrow").resizable()
        }
    }
    
    @ViewBuilder
    var content: some View {
        if let currentView = showSheet {
            switch currentView {
            case .add:
                AddAsset(showSheetView: $showSheetView)
            case .edit:
                EditAsset(showSheetView: $showSheetView)
            }
        }
    }
    
}

以下是两个视图 - AddAsset 和 EditAsset

struct AddAsset: View {
    @Binding var showSheetView: Bool

    var body: some View {
        NavigationView {
            Text("Add Asset")
                .navigationBarTitle(Text("Add"), displayMode: .inline)
                .navigationBarItems(trailing: Button(action: {
                    print("Dismissing sheet view...")
                    self.showSheetView = false
                }) {
                    Text("Done").bold()
                })
        }
    }
}

struct EditAsset: View {
    @Binding var showSheetView: Bool
    var body: some View {
        NavigationView {
            Text("Edit Asset")
                .navigationBarTitle(Text("Edit"), displayMode: .inline)
                .navigationBarItems(trailing: Button(action: {
                    print("Dismissing sheet view...")
                    self.showSheetView = false
                }) {
                    Text("Done").bold()
                })
        }
    }
}

【问题讨论】:

    标签: ios swift swiftui


    【解决方案1】:

    解决方案是使用sheet(item: 变体。

    这里是固定代码(有很多变化,所以包括所有组件)。使用 Xcode 12.1 / iOS 14.1 测试

    enum SheetView: Identifiable {
        var id: Self { self }
        case add, edit
    }
    
    struct ContentView: View {
        @State private var showSheet: SheetView? = nil
        
        var body: some View {
            GeometryReader { g in
                NavigationView {
                    Text("Main Page")
                        .padding()
                        .navigationBarTitle("Main Page")
                        .navigationBarItems(trailing: actionItems)
                }
            }.sheet(item: $showSheet) { mode in
                content(for: mode)
            }
        }
        
        var actionItems: some View {
            Menu {
                Button(action: {
                    showSheet = .add
                }) {
                    Label("Add Asset", systemImage: "plus")
                }
                Button(action: {
                    showSheet = .edit
                }) {
                    Label("Edit Asset", systemImage: "minus")
                }
            } label: {
                Image(systemName: "dot.circle.and.cursorarrow").resizable()
            }
        }
        
        @ViewBuilder
        func content(for mode: SheetView) -> some View {
            switch mode {
            case .add:
                AddAsset(showSheet: $showSheet)
            case .edit:
                EditAsset(showSheet: $showSheet)
            }
        }
        
    }
    
    struct AddAsset: View {
        @Binding var showSheet: SheetView?
        
        var body: some View {
            NavigationView {
                Text("Add Asset")
                    .navigationBarTitle(Text("Add"), displayMode: .inline)
                    .navigationBarItems(trailing: Button(action: {
                        print("Dismissing sheet view...")
                        self.showSheet = nil
                    }) {
                        Text("Done").bold()
                    })
            }
        }
    }
    
    struct EditAsset: View {
        @Binding var showSheet: SheetView?
        var body: some View {
            NavigationView {
                Text("Edit Asset")
                    .navigationBarTitle(Text("Edit"), displayMode: .inline)
                    .navigationBarItems(trailing: Button(action: {
                        print("Dismissing sheet view...")
                        self.showSheet = nil
                    }) {
                        Text("Done").bold()
                    })
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2020-12-19
      • 2020-01-21
      • 1970-01-01
      • 2011-04-09
      • 1970-01-01
      • 2023-02-22
      • 2014-05-02
      • 2014-05-29
      • 1970-01-01
      相关资源
      最近更新 更多